MySQL查询使用filesort和临时

时间:2012-04-03 19:03:42

标签: mysql query-optimization

我使用的是一个简单的MySQL查询,但由于使用了ORDER BY,性能确实很差。我无法弄清楚为什么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

更新:

我试图创建两个新索引,但两者仍然迫使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)

2 个答案:

答案 0 :(得分:4)

为了将索引用于选择和排序,您需要在事件的多列索引中包含以下所有列:(ServerID, LogFileID, ReportID, TimeWritten)

目前,MySQL无法利用现有的多列索引,因为它不包含LogFileID条款中的ON

如果您遇到MySQL首先从EventLogFiles中选择的问题,您可以将INNER JOIN更改为STRAIGHT JOIN以确保MySQL始终首先使用您的索引从事件中选择。

答案 1 :(得分:0)

为了在没有临时表和文件排序的情况下使其工作,您必须创建索引(ServerID, LogFileID, ReportID)并且TimeWritten必须像您一直使用的auto_increment一样顺序ReportID,因此制作ORDER BY ReportID(PK - Order Physical)时必须删除文件。