EXPLAIN SELECT ...;
EXPLAIN EXTENDED SELECT ...; -- 顯示優化器重寫後的 SQL,配合 SHOW WARNINGS
EXPLAIN PARTITIONS SELECT ...; -- 分區表專用
| 欄位 | 含義 |
|---|---|
| id | SELECT 識別符,數字越大優先級越高(子查詢),相同 id 從上往下執行 |
| select_type | SIMPLE/PRIMARY/SUBQUERY/DERIVED/UNION/UNION RESULT |
| type | 訪問類型,由差到優:ALL > index > range > ref > eq_ref > const/system > NULL |
| possible_keys | 理論上可用的索引 |
| key | 實際使用的索引(NULL 表示無索引) |
| key_len | 索引使用的字節數,可推斷聯合索引用了幾列 |
| ref | 連接匹配條件(列名、常量、函數) |
| rows | 預估掃描行數(統計信息估算,非精確) |
| Extra | 額外信息:Using index、Using where、Using temporary、Using filesort 等 |
EXPLAIN SELECT * FROM t1;
-- type=ALL, key=NULL
EXPLAIN SELECT id FROM t1; -- 僅讀索引列
-- type=index
BETWEEN、<、>、IN、LIKE 'prefix%' 觸發。
使用非唯一索引或唯一索引前綴查找,返回多行。
主鍵或唯一索引等值查找,每值最多一行,JOIN 時常見。
主鍵/唯一鍵與常量比較,優化器直接將查詢轉為常量。system 為單行表特例。
優化階段即可確定結果(如 SELECT 1 FROM t WHERE 0)。
CHAR(n) = n * 字符集最大字節(utf8=3, utf8mb4=4)。VARCHAR(n) = n * 字符集最大字節 + 2 字節長度前綴。key_len 為索引定義的最大長度,非運行時實際長度。GROUP BY/DISTINCT/ORDER BY 不走索引)。rows 為估算值。SELECT,其他語句需改寫為 SELECT 查看。