EXPLAIN 是 SQL 優化的核心工具。本文系統整理 10 大輸出欄位含義、type 連接類型優劣排序、Extra 關鍵提示語義,並附實戰範例助您快速定位慢查詢根因。
EXPLAIN SELECT * FROM t3 WHERE id = 3952602;
| 欄位 | 含義 | 關鍵判讀 |
|---|---|---|
id | SELECT 識別符,執行順序由大到小 | 子查詢 id 較大,先執行;衍生表顯示 <derivedN> |
select_type | 查詢類型 | SIMPLE/PRIMARY/UNION/DEPENDENT UNION/SUBQUERY/DEPENDENT SUBQUERY/DERIVED/UNION RESULT |
table | 存取的表(或衍生表 <derivedN>) | 非實體表名表示中間結果集 |
type | **連接類型,效能核心指標** | 優→劣:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL |
possible_keys | 理論可用索引 | 為 NULL 表示無索引可用,需檢查 WHERE 條件列 |
key | 實際選用索引 | 可用 FORCE/USE/IGNORE INDEX 強制指定 |
key_len | 索引鍵長度(位元組) | 越短越好(不損失精度),複合索引僅計算用到的前綴長度 |
ref | 與索引比較的列或常數 | const 表示常數比較;func 表示函數結果 |
rows | 預估掃描行數 | 越小越好,配合 type 判斷效率 |
Extra | 額外資訊(優化關鍵) | 見下表詳細分類 |
EXPLAIN SELECT * FROM (SELECT * FROM t3 WHERE id=3952602) a; -- id=1 type=system (衍生表僅 1 行) -- id=2 type=const (主鍵等值查詢,僅 1 行)
CREATE UNIQUE INDEX idx_t3_id ON t3(id); EXPLAIN SELECT * FROM t3, t4 WHERE t3.id = t4.accountid; -- t3 type=eq_ref (唯一索引等值連接,最佳連接類型)
DROP INDEX idx_t3_id ON t3; CREATE INDEX idx_t3_id ON t3(id); -- 非唯一索引 EXPLAIN SELECT * FROM t3, t4 WHERE t3.id = t4.accountid; -- t3 type=ref (非唯一索引等值連接)
EXPLAIN SELECT * FROM t4 WHERE id=3952602 OR accountid=31754306; -- type=index_merge, key=idx_t4_id,idx_t4_accountid, Extra=Using union(...)
EXPLAIN SELECT * FROM t3 WHERE id=3952602 OR id=3952603; -- type=range, key=idx_t3_id, rows=2
index:全索引掃描(僅讀索引樹,比 ALL 快)。ALL:全表掃描,**需優化**(加索引、改寫 SQL)。| 提示 | 含義 | 是否需優化 |
|---|---|---|
Using index | 覆蓋索引,僅讀索引不回表 | 否(優) |
Using where | WHERE 過濾(Server 層過濾) | 視情況 |
Using index condition | ICP (Index Condition Pushdown),存儲引擎層過濾 | 否(優) |
Using filesort | **外部排序,無索引支援 ORDER BY** | 是 |
Using temporary | **建立臨時表(通常 GROUP BY/DISTINCT/Order BY 不同)** | 是 |
Using join buffer | Join Buffer 機制(通常 type=ALL/index) | 視情況 |
Impossible WHERE | WHERE 條件永假(如 id=1 AND id=2) | 檢查 SQL 邏輯 |
Select tables optimized away | 聚合查詢優化掃描(如 MIN/MAX 走索引) | 否(優) |
Distinct / Not exists | 早期終止優化 | 否(優) |
type 至少達 ref,最好 eq_ref/const;Extra 無 Using filesort/Using temporary。LIKE '%...' 導致全掃。LIMIT 100000, 10 改為「延遲關聯」或「游標分頁」。ANALYZE TABLE 更新統計資訊,OPTIMIZE TABLE 整理碎片。EXPLAIN FORMAT=JSON SELECT ...; -- 結構化輸出,含成本估算 EXPLAIN ANALYZE SELECT ...; -- 5.7+ / 8.0,實際執行並回報實際行數、耗時、迴圈次數
EXPLAIN ANALYZE 是**終極優化利器**,能揭露預估與實際的偏差,精準定位問題算子。