Как сойти с помощью временного;Использование сортировки файлов из моего запроса - PullRequest
0 голосов
/ 10 февраля 2012

Объясните

SELECT * 
FROM `EventTimes` 
LEFT JOIN Events on event_id=Events.id
WHERE festival_id = 12 
ORDER BY time;

для таблицы событий У меня есть следующие поля:

id
name
festival_id

и т. Д.

для таблицы EventTimes у меня есть:

id
event_id
time

и т. Д.

Я создаю индекс для EventTimes: create index eventid_time on EventTimes (event_id, time) Я также создаю индекс для событий: create index ev_festivalid on Events (festival_id)

но я получаю

для событий:

Select_type: Simple
Table : Events
Type : ref
possible_keys: PRIMARY,ev_festivalid
key : ev_festivalid
key_len: 5
ref: const
rows : 14
Extra : Using where; Using temporary; Using filesort

для EventTimes:

Select_type: Simple
Table : EventTimes
Type : ref
possible_keys: eventid_time
key : eventid_time
key_len: 5
ref: dbname.Events.id
rows : 1
Extra : Using where

Как избежать использования временных; Использование сортировки файлов в Событиях?

1 Ответ

0 голосов
/ 10 февраля 2012

Причина сортировки файлов заключается в том, что строки возвращаются в порядке, установленном festival_id, и вы переупорядочиваете их по времени, поэтому mysql необходимо пересортировать результаты.Я не вижу простого способа обойти это, учитывая вашу схему и запрос.Если бы я был тобой, я бы не слишком беспокоился о сортировке файлов.Это действительно не так плохо, как кажется.Прочитайте здесь для получения дополнительной информации.

Я также должен отметить, что использование LEFT JOIN не имеет смысла.Поскольку ваше предложение WHERE ссылается на необязательную таблицу, оно отменяет внешнее соединение.Вы должны рассмотреть возможность переписать запрос.

...