我正在使用一个简单的MySQL查询,但由于使用ORDER BY,性能实际上很糟糕。我无法弄清楚为什么MySQL使用filesort和临时。使用filesort和临时的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输出:
表活动结构
表活动指数
表EventLogFiles结构
表EventLogFiles指标
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)
您可以在不订购的情况下将前100个记录输出到临时表,然后仅使用另一个查询来排序这100个记录? – 2012-04-03 19:07:32
将Events.LogFileID添加到多列索引。 – 2012-04-03 19:17:21
你可以尝试创建索引'ServerID_ReportID_TimeWritten_LogFileID','ReportID_TimeWritten_ServerID_LogFileID'?我认为其中之一会有所帮助。 – 2012-04-03 19:18:02