koe*_*oen 5 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
Run Code Online (Sandbox Code Playgroud)
这是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)
Run Code Online (Sandbox Code Playgroud)
为了利用索引进行选择和排序,您需要在 Events: 的多列索引中包含以下列的所有内容(ServerID, LogFileID, ReportID, TimeWritten)。
目前,MySQL 无法利用现有的多列索引,因为它不包含LogFileID您的子句中的ON。
如果您遇到 MySQL 首先从 EventLogFiles 选择的问题,您可以将 更改INNER JOIN为 aSTRAIGHT JOIN以确保 MySQL 始终使用您的索引首先从 Events 选择。