![]() |
![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Есть три таблицы: таблица товаров, таблица опций, и таблица связки товаров и опций, выглядит примерно так:
Таблица товаров: goods
(id, goods_name, goods_description, .....)
Таблица опций: option
(id, option_name)
Таблица связки товаров и опций: goods_option
(goods_id, option_id)
Для каждого товара может быть несколько опций. До некоторого времени, для поиска товара с определенными опциями использовался запрос с использованием INNER JOIN такого вида:
SELECT id, goods_name, goods_description FROM goods
INNER JOIN goods_option AS op1 ON goods.id = op1.goods_id
INNER JOIN goods_option AS op2 ON goods.id = op2.goods_id
INNER JOIN goods_option AS op3 ON goods.id = op3.goods_id
......
WHERE
op1.option_id = 2 &&
op2.option_id = 15 &&
op3.option_id = 23 &&
......
По мере роста базы запросы начали подтормаживать, теперь в базе имеется ~70000 товаров, таблица связки товаров и опций ~100000 записей, если задавать поиск товаров хотя бы по 10 опциям, то 2-х ядерный сервак уходит в ступор от такого запроса.
Подскажите, плиз, можно ли как-то оптимизировать запрос?
Неактивен
Неактивен
vasya, спасибо, помогло...
теперь сервак в ступор не уходит, время выполнения запроса ~0,65 сек
Решил посмотреть что показывает EXPLAIN, немного не понравилось что он не использует индекс в таблице goods_option даже если в запросе указать его использовать, получается что он проходит всю таблицу, а там на данный момент около миллиона записей.
Запрос:
Неактивен
1. Каким образом указываете использование индекса?
http://sqlinfo.ru/forum/viewtopic.php?id=231
2. Для избавления от "Using filesort" используйте order by null
3. Покажите show create table goods_option;
Неактивен
vasya написал:
1. Каким образом указываете использование индекса?
http://sqlinfo.ru/forum/viewtopic.php?id=231
сорри, забыл написать, когда указываю USE INDEX, оно не использует его, и результат EXPLAIN такой, как я привел выше. Если принудительно использовать индекс FORCE INDEX, тогда оно использует этот индекс, рядов пробегает в 2 раза меньше (413013, а не 909816), но время выполнения запроса ~4,5 сек
vasya написал:
2. Для избавления от "Using filesort" используйте order by null
сэнкс, такого не знал, буду в дальнешем применять
vasya написал:
3. Покажите show create table goods_option;
таблица была изначально такой:
Неактивен
_Igor_ написал:
Если принудительно использовать индекс FORCE INDEX, тогда оно использует этот индекс, рядов пробегает в 2 раза меньше (413013, а не 909816), но время выполнения запроса ~4,5 сек
В данном случае полный скан таблицы предпочтительней из-за последовательного чтения диска, поэтому оптимизатор совершенно прав не используя индекс.
Неактивен