首頁  >  文章  >  資料庫  >  為什麼我的 MySQL 查詢使用「使用索引;使用臨時;使用檔案排序」?

為什麼我的 MySQL 查詢使用「使用索引;使用臨時;使用檔案排序」?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 09:42:02774瀏覽

Why is My MySQL Query Using

使用索引、使用臨時、使用檔案排序:您的 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn