EXPLAIN 是 SQL 調優的核心工具,能揭示查詢執行計劃的連接順序、訪問類型、索引使用情況等關鍵資訊。本文系統解析所有輸出欄位含義,並演示 EXPLAIN EXTENDED、EXPLAIN PARTITIONS 進階用法。
| 欄位 | 含義 | 關鍵取值/解讀 |
|---|---|---|
| id | SELECT 標識符 | 相同 id 由上至下執行;id 越大優先級越高(子查詢);相同 id 視為一組 |
| select_type | 查詢類型 | SIMPLE(無 UNION/子查詢)、PRIMARY(最外層)、UNION、DEPENDENT UNION、SUBQUERY、DEPENDENT SUBQUERY(相關子查詢)、DERIVED(派生表)、MATERIALIZED、UNCACHEABLE SUBQUERY |
| table | 輸出行來源表 | 表名、<unionM,N>、<derivedN>、<subqueryN> |
| partitions | 匹配分區 | 需 EXPLAIN PARTITIONS 觸發 |
| type | 連接/訪問類型(優→劣) | system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL |
| possible_keys | 可能用到的索引 | NULL 表示無索引可用,需考慮建立 |
| key | 實際使用的索引 | NULL 表示全表掃描;可能不在 possible_keys 中(覆蓋索引) |
| key_len | 使用索引長度(字節) | 推算聯合索引用了幾列;NULL 表示未用索引 |
| ref | 索引查找條件 | 顯示哪些列/常數用於索引查找 |
| rows | 預估掃描行數 | InnoDB 為估值,非精確值 |
| filtered | 表條件過濾比例% | EXPLAIN EXTENDED 顯示;越高越好 |
| Extra | 額外關鍵資訊 | 見下文重點解析 |
Using index:覆蓋索引,僅掃描索引樹,極快;Using where:Server 層過濾,非存儲引擎層;Using index condition (5.6+):Index Condition Pushdown (ICP),索引條件下推;Using temporary:需建立臨時表(常見於 GROUP BY、DISTINCT、ORDER BY 異表);Using filesort:需額外排序操作(非索引順序);Using join buffer:使用 Join Buffer(Block Nested Loop / Batched Key Access);Impossible WHERE:WHERE 條件永假,優化器直接返回空;Select tables optimized away:聚合查詢優化器直接從索引獲取結果(如 MIN/MAX)。
EXPLAIN EXTENDED SELECT * FROM city WHERE country_id IN
(SELECT country_id FROM country WHERE country='China');
SHOW WARNINGS;
輸出 Message 欄位將顯示優化器重寫後的真實 SQL(如子查詢轉 JOIN、常量折疊、冗餘條件移除),對複雜 SQL 調試極有價值。
CREATE TABLE actor_part (...) PARTITION BY HASH(actor_id) PARTITIONS 4;
EXPLAIN PARTITIONS SELECT * FROM actor_part WHERE actor_id=10;
輸出新增 partitions 欄位(如 p2),確認分區裁剪是否生效,避免全分區掃描。
type 是否為 ALL(全表掃描) → 建立索引;key 是否為 NULL → 索引未命中;rows × filtered% 是否接近實際返回行數 → 統計資訊準確性;Extra 是否含 Using temporary/Using filesort → 優化 GROUP BY/ORDER BY;possible_keys 有值但 key 為 NULL → 索引選擇失效,考慮 FORCE INDEX 或重寫 SQL。