MySQL查询使用filesort和临时

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的输出:

Mysql EXPLAIN输出

表事件结构

表事件结构

表事件索引

表事件索引

表EventLogFiles结构

表EventLogFiles结构

表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)

Mar*_*ams 4

为了利用索引进行选择和排序,您需要在 Events: 的多列索引中包含以下列的所有内容(ServerID, LogFileID, ReportID, TimeWritten)

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

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