為什麼MySQL 在此查詢中使用臨時和文件排序
從event_log 和Lookup_event_objects 表中提取性能瓶頸信息的面臨性能瓶頸信息的面臨性能瓶頸,如EXPLAIN 輸出「使用索引;使用臨時;使用檔案排序」所示。原因如下:
臨時表
當 ORDER BY 和 GROUP BY 子句不符時,或當排序或分組列屬於非-連接表。在這種情況下,您的查詢會遇到第一個條件,因為 ORDER BY 子句(count_rows DESC、leo.object_desc ASC)與 GROUP BY 子句 (el.object_id) 不同。
Filesort
「Using filesort」表示MySQL無法使用索引執行ORDER BY子句中指定的排序。由於您是按計算欄位 (count_rows) 進行排序,因此資料庫需要執行完整的表格掃描並對結果進行排序。
可能的解決方案
如建議的根據提供的答案,解決方案是消除 ORDER BY 和 GROUP BY 子句之間的差異。您可以將 count_rows 別名替換為 GROUP BY 子句中的實際計數操作:
SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id, count ORDER BY count DESC, leo.object_desc ASC;
這將消除對臨時表和檔案排序的需要,從而可能提高查詢的效能。
以上是為什麼我的查詢使用臨時表和文件排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!