EXPLAIN 核心列速查與連接類型優劣對照表
本文為 EXPLAIN 精簡參考,聚焦輸出列含義、連接類型排序、Extra 關鍵值、實戰判讀口訣。完整深度解析請參考「MySQL EXPLAIN 執行計劃詳解」。
一、基本用法
EXPLAIN SELECT * FROM `users` WHERE id = 1;
二、輸出列速查
| 列 | 含義 | 關鍵判讀 |
table | 涉及的表(或派生表 <derivedN>) | - |
type | 核心:訪問策略/連接類型 | 優→劣:system > const > eq_ref > ref > range > index > ALL |
possible_keys | 可能用到的索引 | 為 NULL 表示無索引可用,需檢查 WHERE 條件列 |
key | 實際選用的索引 | 為 NULL 表示全掃;可用 USE/FORCE/IGNORE INDEX 干預 |
key_len | 使用索引長度(字節) | 越短越好;組合索引可判斷用了幾列 |
ref | 與索引比較的引用(常數/列/函數) | const 表示常數等值 |
rows | 預估掃描行數 | 越小越好;偏大需 ANALYZE TABLE |
Extra | 額外執行信息 | 關注 Using index(好)、Using temporary/filesort(需優化) |
三、Extra 關鍵值對照
| 值 | 含義 | 優化方向 |
Using index | 覆蓋索引,不回表 | 優秀,設計覆蓋索引可獲取 |
Using where | Server 層 WHERE 過濾 | 正常;若 type=ALL 需加索引 |
Using temporary | 創建臨時表(ORDER BY/GROUP BY 列不一致) | 需優化:調整索引順序 |
Using filesort | 文件排序(無索引支持 ORDER BY) | 需優化:添加排序列索引 |
Using index condition | ICP 索引條件下推 (MySQL 5.6+) | 優化特性 |
Distinct/Not exists | 早期終止優化 | 正常 |
四、連接類型詳細解釋(優→劣)
- system:表僅一行(const 特例)
- const:主鍵/唯一索引等值,最多一行,極快
- eq_ref:唯一索引/主鍵連接,每行匹配一行,最佳連接
- ref:非唯一索引/最左前綴連接,匹配少行則好
- range:索引范圍掃描(>、<、BETWEEN、IN)
- index:全索引掃描(比 ALL 快)
- ALL:全表掃描,**最差**,需加索引優化
五、實戰判讀口訣
一看 type:const/eq_ref/ref/range 好,ALL/index 差
二看 key:預期索引是否被用上,key_len 組合索引用幾列
三看 rows:預估掃描行數是否合理
四看 Extra:Using index 好,Using temporary/filesort 壞
五對比 possible_keys vs key:為何優化器捨優選劣?
六、常見優化場景速查
type=ALL → 加索引、檢查 WHERE 條件列
Using filesort → 添加 ORDER BY 列索引、組合索引包含排序列
Using temporary → 調整 GROUP BY/ORDER BY 列順序與索引一致
key=NULL 但有 possible_keys → FORCE INDEX 強制、檢查條件是否命中最左前綴
- 隱式類型轉換(字符串列比數字) → 修正應用層參數類型