我使用的是一个简单的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的输出:
表事件结构
表事件索引
表EventLogFiles结构
表EventLogFiles索引
更新:
我试图创建两个新索引,但两者仍然迫使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)
答案 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)
时必须删除文件。