Предотвращение использования временной таблицы в запросе

#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:

Вы выполняете запрос, который не может быть оптимизирован должным образом:

  1. Старайтесь избегать использования OR
  2. Mysql не может оптимизировать (использовать индексы) для сортировки в разных направлениях (вы используете оба ASC и DESC в одном ORDER BY )
  3. DAYOFYEAR( deal.created ) избегайте использования функций над полями, по которым выполняется поиск

Но вы не должны знать об этом temporary table ярлыке, пока не будете удовлетворены производительностью запроса, или нет?

Комментарии:

1. Спасибо за оценки…. Я удовлетворен, но поскольку это основной запрос на моем сайте, я подумал, что в любом случае посмотрю, можно ли его улучшить.

2. @Webnet: 10×235 строк — это слишком мало, чтобы беспокоиться. Но в любом случае имейте в виду пункты 1,2,3, которые я упомянул выше