我正在使用一個簡單的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