MySQL запрос с использованием файловой сортировки и временной - PullRequest
5 голосов
/ 03 апреля 2012

Я использую простой запрос MySQL, но производительность действительно плохая из-за использования ORDER BY. Я не могу понять, почему MySQL использует файловую сортировку и временную.

Мой запрос:

EXPLAIN 
SELECT * FROM Events
INNER JOIN EventLogFiles ON ServerID = 42
AND Events.LogFileID = EventLogFiles.LogFileID
ORDER BY ReportID DESC , TimeWritten DESC 
LIMIT 100

Это вывод EXPLAIN:

Mysql EXPLAIN output

Структура таблицы событий

Table Events structure

Индексы табличных событий

Table Events indexes

Таблица EventLogFiles структура

Table EventLogFiles structure

Таблица индексов EventLogFiles

Table EventLogFiles indexes

UPDATE:

Я пытался создать два новых индекса, но оба все еще заставляют MySQL использовать файловую сортировку и временные.

ALTER TABLE Events ADD INDEX  `ReportID_TimeWritten_ServerID_LogFileID` ( ReportID DESC,  TimeWritten DESC,  ServerID,  LogFileID)

ALTER TABLE Events ADD INDEX  `ServerID_LogFileID_ReportID_TimeWritten` ( ServerID,  LogFileID, ReportID DESC,  TimeWritten DESC)

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Чтобы использовать индекс как для выбора, так и для сортировки, необходимо иметь все следующие столбцы в многостолбцовом индексе по событиям: (ServerID, LogFileID, ReportID, TimeWritten).

В настоящее время MySQL не может использовать существующий многостолбцовый индекс, поскольку он не включает LogFileID, что содержится в предложении ON.

Если у вас когда-либо возникают проблемы, когда MySQL сначала выбирает из EventLogFiles, вы можете изменить INNER JOIN на STRAIGHT JOIN, чтобы MySQL всегда выбирал сначала из Events, используя ваш индекс.

0 голосов
/ 14 августа 2013

Для того, чтобы это работало без временных таблиц и сортировки файлов, вы должны создать индекс (ServerID, LogFileID, ReportID) и TimeWritten должны быть последовательными, как auto_increment, который вы использовали в ReportID, поэтомуORDER BY ReportID(PK - Order Physical) вы должны удалить сортировку файлов.

...