#mysql #query-optimization
#mysql #оптимизация запроса
Вопрос:
Я запускаю explain extended в приведенном ниже запросе, и я не уверен, почему это происходит. Я добавил индекс на site.id, site.parent_id, and site.enabled
, но я все еще вижу, что он создает временную таблицу.
SELECT site.label AS site_label, deal . * , site.id AS site_id
FROM site
LEFT JOIN deal ON ( deal.site_id = site.id
AND DAYOFYEAR( deal.created ) = DAYOFYEAR( NOW( ) ) )
WHERE (
site.id =2
OR site.parent_id =2
)
AND site.enabled =1
ORDER BY site.order ASC , deal.created DESC
Любые предложения о том, как я могу предотвратить использование временной таблицы?
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE site ALL id,parent_id,id_2 NULL NULL NULL 10 100.00 Using where; Using temporary; Using filesort
1 SIMPLE deal ref site_id site_id 4 dealclippings.site.id 235 100.00
Комментарии:
1. Ваша цель — ускорить выполнение запроса или просто избежать
temporary table
метки?I'm still seeing that it's creating a temporary table
ну и что?
Ответ №1:
Вы выполняете запрос, который не может быть оптимизирован должным образом:
- Старайтесь избегать использования
OR
- Mysql не может оптимизировать (использовать индексы) для сортировки в разных направлениях (вы используете оба
ASC
иDESC
в одномORDER BY
) DAYOFYEAR( deal.created )
избегайте использования функций над полями, по которым выполняется поиск
Но вы не должны знать об этом temporary table
ярлыке, пока не будете удовлетворены производительностью запроса, или нет?
Комментарии:
1. Спасибо за оценки…. Я удовлетворен, но поскольку это основной запрос на моем сайте, я подумал, что в любом случае посмотрю, можно ли его улучшить.
2. @Webnet: 10×235 строк — это слишком мало, чтобы беспокоиться. Но в любом случае имейте в виду пункты 1,2,3, которые я упомянул выше