EXPLAIN 是 MySQL 查詢調優的「核磁共振」,能揭示優化器如何執行 SELECT。本文系統講解 輸出字段含義、連接類型層級、Extra 關鍵信息,並通過一個多表 JOIN 實戰案例演示從「全表掃描笛卡爾積」到「索引嵌套循環」的優化全過程。
-- 1. 表結構別名(等同 DESCRIBE/SHOW COLUMNS)
EXPLAIN tbl_name;
-- 2. 查詢執行計劃(核心用法)
EXPLAIN SELECT select_options ...;
| 字段 | 含義 | 關鍵取值/判讀 |
|---|---|---|
| id | SELECT 標識符 | 同一查詢中遞增;衍生表/子查詢有獨立 id |
| select_type | 查詢類型 | SIMPLE/PRIMARY/UNION/DEPENDENT UNION/SUBQUERY/DEPENDENT SUBQUERY/DERIVED |
| table | 引用表 | 別名或 |
| type | 連接類型(性能核心指標) | system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL |
| possible_keys | 可能用到的索引 | NULL 表示無索引可用 → 檢查 WHERE/JOIN 列 |
| key | 實際使用的索引 | NULL 表示未用索引;可用 FORCE/USE/IGNORE INDEX 干預 |
| key_len | 索引使用長度 | 聯合索引判斷用了幾列;NULL 表未用索引 |
| ref | 關聯比較值 | 常量/列名/表達式 |
| rows | 預估掃描行數 | 所有表 rows 乘積 ≈ 總訪問行數;偏大說明統計信息過期 |
| Extra | 附加信息 | 見下文關鍵值解讀 |
| 值 | 含義 | 嚴重程度 | 對策 |
|---|---|---|---|
| Using filesort | 需額外排序(無索引服務 ORDER BY) | 🔴 高 | 調整索引順序/增加排序緩存 |
| Using temporary | 需創建臨時表(GROUP BY/ORDER BY 列不一致) | 🔴 高 | 統一排序分組列/增加索引 |
| Using index | 覆蓋索引(僅讀索引不回表) | 🟢 優 | 維持/擴展覆蓋索引 |
| Using where | WHERE 過濾(ALL/index 類型下出現需警惕) | 🟡 中 | 檢查是否可下推索引 |
| Distinct | 找到首匹配即停止 | 🟢 優 | - |
| Not exists | LEFT JOIN 優化(滿足即停止) | 🟢 優 | - |
| Range checked... | 逐行決定索引(無好索引) | 🟠 中 | 建立更合適索引 |
EXPLAIN SELECT tt.TicketNumber, ..., do.CUSTNAME
FROM tt, et, et AS et_1, do
WHERE tt.SubmitTime IS NULL
AND tt.ActualPC = et.EMPLOYID
AND tt.AssignedPC = et_1.EMPLOYID
AND tt.ClientID = do.CUSTNMBR;
table type possible_keys key key_len ref rows Extra
et ALL PRIMARY NULL NULL NULL 74
do ALL PRIMARY NULL NULL NULL 2135
et_1 ALL PRIMARY NULL NULL NULL 74
tt ALL AssignedPC... NULL NULL NULL 3872 range checked...
-- 總掃描行數:74 × 2135 × 74 × 3872 ≈ 4.5×10¹⁰
ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
-- et.EMPLOYID 已是 CHAR(15)
-- 結果:et 變為 eq_ref,rows 乘積減少 74 倍
ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), MODIFY ClientID VARCHAR(15);
-- 結果:et_1、do 均變為 eq_ref,tt 為 ref,僅掃描 52 行
ANALYZE TABLE tt;
-- 優化器獲得真實分布,tt 變為 ALL 但僅掃 3872 行(全表),其餘均 eq_ref 1 行
-- 最終總訪問行數 ≈ 3872,性能提升 10⁷ 倍量級
table type possible_keys key key_len ref rows Extra
tt ALL AssignedPC... NULL NULL NULL 3872 Using where
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
max_join_size 限制失控查詢EXPLAIN 不是終點,是起點。讀懂 type、key、rows、Extra 四大核心字段,結合 索引列定義一致性、統計信息鮮度、WHERE/JOIN/ORDER BY 列與索引對齊 三大原則,即可系統性解決 90% 的查詢性能問題。