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

MySQL EXPLAIN 實戰:從全表掃描到索引優化的完整排查流程

     編輯:MySQL 綜合教學

EXPLAIN 輸出欄位深度解讀

面對緩慢的 SQL,EXPLAIN(或 DESC)是首選診斷工具。以下以雙表關聯聚合查詢為例:

EXPLAIN SELECT SUM(profit) 
FROM sales a, company b 
WHERE a.company_id = b.id AND a.year = 2006\G
欄位核心含義性能關鍵點
id查詢序號相同 id 表示同一查詢塊,按順序執行
select_type查詢類型SIMPLE(無子查詢/關聯)、PRIMARY(外層)、UNION、SUBQUERY 等
table輸出結果表關注驅動表與被驅動表順序
type連接/訪問類型system > const > eq_ref > ref > range > index > ALL(由優到劣)
possible_keys可能用到的索引為空提示無可用索引
key實際使用索引為空 = 全表掃描,需優先優化
key_len索引長度(字節)推斷聯合索引用了幾列
ref關聯比較列/常量const 表示常量等值查詢
rows預估掃描行數越小越好,結合 type 判斷效率
Extra額外信息Using index(覆蓋索引)、Using where、Using temporary、Using filesort 需警惕

實戰優化演示:消除全表掃描

優化前:雙表 ALL 型全掃描

*************************** 1. row ***************************
table: a
type: ALL
possible_keys: NULL
key: NULL
rows: 12
Extra: Using where
*************************** 2. row ***************************
table: b
type: ALL
possible_keys: NULL
key: NULL
rows: 12
Extra: Using where

診斷: 表 sales(別名 a)在 year 列無索引,導致全表掃描 12 行(實際大表中行數可達百萬級)。

建立索引

CREATE INDEX idx_sales_year ON sales(year);

優化後:驅動表轉為 ref 類型

*************************** 1. row ***************************
table: a
type: ref
possible_keys: idx_sales_year
key: idx_sales_year
key_len: 4
ref: const
rows: 3
Extra: 
*************************** 2. row ***************************
table: b
type: ALL
possible_keys: NULL
key: NULL
rows: 12
Extra: Using where

效果: 表 a 掃描行數從 12 降至 3,若表有 1000 萬行且年份選擇性高,性能提升可達數量級。

索引優化核心原則

  1. WHERE/JOIN/ORDER BY 列優先建索引,特別是高選擇性列(唯一值多)。
  2. 覆蓋索引:Extra 出現 Using index 表示無需回表,極大提升速度。
  3. 避免隱式轉換:列類型與條件值類型不一致會導致索引失效。
  4. 聯合索引最左前綴:(a,b,c) 支持 a、a,b、a,b,c 查詢,不支持單獨 b 或 c。

進階技巧:EXPLAIN ANALYZE (MySQL 8.0.18+)

EXPLAIN ANALYZE SELECT ...

輸出實際執行時間、實際掃描行數、循環次數,對比預估值精準定位優化器誤判場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved