首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL EXPLAIN 深度解讀:執行計劃各字段含義、類型優劣順序與優化實戰案例

     編輯:MySQL 綜合教學

EXPLAIN 執行計劃完全指南:從輸出解讀到索引優化實戰

輸出字段完整解讀 (MySQL 5.6+)

字段含義關鍵關注點
idSELECT 標識符,遞增數字相同 id 從上到下執行;不同 id 數字大先執行
select_type查詢類型SIMPLE/PRIMARY/UNION/SUBQUERY/DERIVED/DEPENDENT...
table訪問的表 (含衍生表/別名)<derived2> 表示衍生表
partitions匹配的分區 (5.6+)分區裁剪驗證
type訪問類型 (核心!)system > const > eq_ref > ref > range > index > ALL
possible_keys可能用到的索引僅參考,不代表實際使用
key實際使用的索引NULL = 全表掃描
key_len索引鍵長度 (字節)判斷組合索引用了幾列
ref與 key 配合的列/常量const/func/列名
rows預估掃描行數越小越好,乘積反映總掃描量
filtered條件過濾比例 (5.6+)100 = 無過濾,越低說明索引選擇性差
Extra額外信息 (關鍵!)Using index/Where/Filesort/Temporary/Impossible WHERE

type 類型優劣完整順序 (最好 → 最差)

  1. system:表僅 1 行 (系統表)
  2. const:主鍵/唯一索引等值查詢,最多 1 行,優化器當常量處理
  3. eq_ref:主鍵/唯一索引 JOIN,每張表最多 1 行匹配
  4. ref:非唯一索引等值查詢/JOIN,可能多行
  5. ref_or_null:ref + NULL 值補充
  6. unique_subquery:IN 子查詢主鍵優化
  7. index_subquery:IN 子查詢非唯一索引優化
  8. range:索引範圍掃描 (<, >, >=, BETWEEN, IN)
  9. index:全索引掃描 (不讀數據文件)
  10. ALL:全表掃描 (最差,需優化)

Extra 關鍵值含義

值含義優化方向
Using index覆蓋索引 (僅讀索引)✅ 優秀,無需回表
Using whereServer 層過濾正常,但若 type=ALL 則需加索引
Using index condition (5.6+)ICP 索引條件下推✅ 優秀,減少回表
Using temporary創建臨時表❌ 優化 GROUP BY/ORDER BY
Using filesort外部排序❌ 加索引消除排序
Using join bufferJoin Buffer 內存連接❌ 小表驅動大表/加索引
Impossible WHEREWHERE 條件永假✅ 優化器直接返回空
Select tables optimized away聚合函數優化 (MIN/MAX/COUNT)✅ 極優

實戰優化案例:四表關聯從 450億 掃描降至 3872 行

初始狀態

EXPLAIN SELECT ... FROM tt, et, et et_1, do
WHERE tt.submittime IS NULL
  AND tt.actualpc = et.employid
  AND tt.assignedpc = et_1.employid
  AND tt.clientid = do.custnmbr;

-- 所有表 type=ALL,rows 乘積 74*2135*74*3872 = 452億
-- Extra: range checked for each record

優化步驟

  1. 修正字段長度不一致:CHAR(10) vs CHAR(15) 導致索引失效
    ALTER TABLE tt MODIFY actualpc VARCHAR(15),
                        MODIFY assignedpc VARCHAR(15),
                        MODIFY clientid VARCHAR(15);
  2. 執行 ANALYZE TABLE 更新統計信息,優化器獲得真實分布

最終執行計劃

+-------+--------+----------------+---------+--------+------+-------+--------------------------+
| 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 |                          |
+-------+--------+----------------+---------+--------+------+-------+--------------------------+

掃描行數:3872 × 1 × 1 × 1 = 3872,性能提升 1160萬倍!

進階技巧

  • EXPLAIN FORMAT=JSON (5.6+) 獲取更豐富信息 (成本估算、ICP細節)
  • EXPLAIN ANALYZE (8.0.18+) 顯示實際執行時間/行數 vs 預估
  • 配合 SHOW INDEX / SHOW TABLE STATUS 驗證索引定義
  • 使用 STRAIGHT_JOIN 強制連接順序 (僅作調試)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved