EXPLAIN 是洞悉 MySQL 優化器如何決定查詢執行路徑的主要工具。雖然它有其局限性(並非總能說出絕對真相),但它提供了我們能獲得的最佳參考信息。只有深入理解 EXPLAIN 的輸出,才能真正掌握 MySQL 優化器的工作邏輯,進而實現有效的 SQL 優化。
使用方式極為簡單:只需在 SELECT 語句前加上 EXPLAIN 關鍵字即可。
EXPLAIN SELECT * FROM users WHERE id = 1;
為了獲得更清晰、垂直顯示的輸出結果,建議在語句結尾(分號之前)加上 \G:
EXPLAIN SELECT * FROM users WHERE id = 1\G
注意: EXPLAIN 僅支持對 SELECT 查詢進行分析,INSERT、UPDATE、DELETE 等語句不支持直接使用 EXPLAIN。
標識 SELECT 查詢的序號。若查詢中不包含子查詢或 UNION,則顯示為 1。若存在複雜查詢,內層 SELECT 會按順序編號。
MySQL 將 SELECT 分為簡單查詢和複雜查詢(包含簡單子查詢、派生表、UNION 查詢)。
顯示對應行是簡單還是複雜 SELECT 的類型:
顯示該行正在訪問的表名。若 FROM 子句包含子查詢或 UNION,則顯示為 <derivedN>,N 對應 id 值。
這是判斷查詢效率的關鍵指標:
BETWEEN、>、IN()、OR)。SELECT MIN(id) FROM t)。查詢理論上可用的索引列表,基於查詢條件列和操作符判斷。
MySQL實際選擇使用的索引。若為 NULL,表示未使用索引。
索引中使用的字節數。可推斷聯合索引實際用了幾列。例如 INT 類型主鍵為 4 字節,SMALLINT 為 2 字節。
顯示哪些列或常量被用於與 key 列記錄的索引進行比較查找。
MySQL 預估為找到所需數據而需讀取的行數(統計信息估算值,非精確值)。
包含不適合在其他列顯示的額外信息,常見值:
掌握 EXPLAIN 各列含義,結合 type、key、rows、Extra 等關鍵指標,即可精準定位 SQL 性能瓶頸,指導索引優化與查詢重寫。