Помогите оптимизировать SQL запрос

D
На сайте с 28.06.2008
Offline
1114
758

Есть запрос показывающий 5 лучших фирм

С двумя LEFT JOIN время выполнения ~1.5 сек.

SELECT items.name, ROUND(items.average, 1)
AS average, items.comments, CONCAT('/firm/', sections.id, '-', sections.alias, '/', categories.id, '-', categories.alias, '/', items.id, '-', items.alias)
AS url FROM cl6s3_firm_items AS items
LEFT JOIN cl6s3_firm_categories AS categories ON items.category_id = categories.id
LEFT JOIN cl6s3_firm_sections AS sections ON items.section_id = sections.id
WHERE items.section_id IN(5,9,31)
GROUP BY items.name
ORDER BY items.average DESC LIMIT 5

если заменить на INNER то время чуть улучшается до 1,3 сек (результат тот же), но все равно долго...

SELECT items.name, ROUND(items.average, 1)
AS average, items.comments, CONCAT('/firm/', sections.id, '-', sections.alias, '/', categories.id, '-', categories.alias, '/', items.id, '-', items.alias)
AS url FROM cl6s3_firm_items AS items
INNER JOIN cl6s3_firm_categories AS categories ON items.category_id = categories.id
INNER JOIN cl6s3_firm_sections AS sections ON items.section_id = sections.id
WHERE items.section_id IN(5,9,31)
GROUP BY items.name
ORDER BY items.average DESC LIMIT 5

EXPLAIN запросов прилагаю.

1. - INNER

2. - LEFT

jpg inner.jpg
jpg left.jpg
edogs software
На сайте с 15.12.2005
Offline
775
#1

Смысл есть только в лефт-джоин, чисто логически, так что оптимизируйте его.

У вас на один "айтем" может быть несколько категорий и/или секций?

Если нет, уберите group by в принципе.

Если да (что странно, т.к. вы просто берете случайного представителя из секций и категорий для одного имени айтема), то попробуйте убрать group by и использовать distinct(items.name)

В любом случае, если допустимо, в групповых функциях используйте items.id , а не items.name

Попробуйте повесить индекс на items.average в чистом виде или же на совместный на section_id, average

Какой размер выборки без лимита получается?

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
D
На сайте с 28.06.2008
Offline
1114
#2
edogs:
уберите group by в принципе.

Спасибо!!! Это позволило сократить время запроса до 0.0084 (проверял с SQL_NO_CACHE)

dimsog
На сайте с 08.08.2011
Offline
149
#3

Dram, если есть GROUP BY не по PRIMARY KEY, то у вас будет temporary с вероятностью в 146%, а если есть ORDER BY не по ключу с JOIN, то будет и filesort. Ну это так, на будущее :)

ihor vps -> ihc.ru
C
На сайте с 04.02.2005
Offline
291
#4
Dram:
С двумя LEFT JOIN время выполнения ~1.5 сек.
Dram:
если заменить на INNER то время чуть улучшается до 1,3 сек (результат тот же), но все равно долго...

Это понятно

Потому что размер кортежа разный, а вы еще сортируете

Dram:
ORDER BY items.average

Но у вас нет агрегатных функций

Dram:
GROUP BY items.name

не нужно (уже сказано)

странно что нет DISTINCT :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий