使用索引、使用臨時、使用檔案排序:您的 MySQL 查詢需要最佳化嗎?
從資料庫表中檢索資料時,至關重要編寫有效的查詢,最大限度地減少處理時間和資源消耗。 MySQL 提供了各種最佳化技術來促進更快的查詢執行,但有時,查詢仍然會表現出次優的行為。在本例中,我們將探索在 EXPLAIN 輸出中傳回「使用索引;使用臨時;使用檔案排序」的查詢。
讓我們檢查提供的查詢:
explain SELECT el.object_id, leo.object_desc, COUNT(el.object_id) as count_rows FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id ORDER BY count_rows DESC, leo.object_desc ASC
理解「使用臨時表」
MySQL 文件指出,當ORDER BY 和GROUP BY子句之間存在差異,或當ORDER BY 或GROUP BY 包含表中的列時,可以建立臨時表除了連接佇列中的第一個表之外。在此查詢中,我們滿足了兩個條件。 ORDER BY 子句依 count_rows(計算欄位)排序,GROUP BY 子句會依照來自不同資料表的 el.object_id 分組。因此,使用臨時表來促進排序和分組過程。
理解「使用檔案排序」
由於排序是在計算欄位 count_rows 上執行的,索引不能用於此操作。因此,MySQL 求助於使用檔案排序,即從磁碟讀取資料並在記憶體中排序,然後傳回結果。
最佳化查詢
以提高效能為了避免這個查詢並消除臨時表和檔案排序的使用,我們可以考慮建立一個適當的索引,例如:
CREATE INDEX idx_event_log_object_count ON event_log(object_id, COUNT(event_id));
這個索引將允許MySQL直接擷取每個object_id的事件計數,消除需要臨時表和檔案排序。
以上是為什麼我的 MySQL 查詢使用「使用索引;使用臨時;使用檔案排序」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!