2012-04-03 3 views
5

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

Мой запрос:

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 использовать filesort и временные.

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) 
+1

Можете ли вы вывести первые 100 записей во временную таблицу без упорядочения, а затем заказывать только 100 записей с другим запросом? –

+1

Добавить Events.LogFileID в индекс с несколькими столбцами. –

+0

Не могли бы вы попытаться создать индексы 'ServerID_ReportID_TimeWritten_LogFileID',' ReportID_TimeWritten_ServerID_LogFileID'? Я думаю, что один из них поможет. –

ответ

4

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

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

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

+0

Маркус, я следовал вашим советам, но по-прежнему та же проблема, есть ли у вас какие-либо идеи? Ключ: ServerID_LogFileID_ReportID_TimeWritten | key_len: 4 | Дополнительно: использование временных; Использование filesort – koen

+0

Key_len не может быть 4 для индекса с несколькими столбцами. Это должно быть 16. Я бы дважды проверял ваш запрос и индекс. –

0

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