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

MySQL EXPLAIN 詳解:掌握查詢執行計劃的核心鑰匙

     編輯:MySQL 綜合教學

MySQL EXPLAIN 詳解:掌握查詢執行計劃的核心鑰匙

EXPLAIN 是洞悉 MySQL 優化器如何決定查詢執行路徑的主要工具。雖然它有其局限性(並非總能說出絕對真相),但它提供了我們能獲得的最佳參考信息。只有深入理解 EXPLAIN 的輸出,才能真正掌握 MySQL 優化器的工作邏輯,進而實現有效的 SQL 優化。

如何調用 EXPLAIN?

使用方式極為簡單:只需在 SELECT 語句前加上 EXPLAIN 關鍵字即可。

EXPLAIN SELECT * FROM users WHERE id = 1;

為了獲得更清晰、垂直顯示的輸出結果,建議在語句結尾(分號之前)加上 \G:

EXPLAIN SELECT * FROM users WHERE id = 1\G

注意: EXPLAIN 僅支持對 SELECT 查詢進行分析,INSERT、UPDATE、DELETE 等語句不支持直接使用 EXPLAIN。

EXPLAIN 輸出列詳細解讀

1. id 列

標識 SELECT 查詢的序號。若查詢中不包含子查詢或 UNION,則顯示為 1。若存在複雜查詢,內層 SELECT 會按順序編號。

MySQL 將 SELECT 分為簡單查詢和複雜查詢(包含簡單子查詢、派生表、UNION 查詢)。

2. select_type 列

顯示對應行是簡單還是複雜 SELECT 的類型:

  • SIMPLE:不包含子查詢和 UNION 的簡單查詢。
  • PRIMARY:包含子查詢或 UNION 時,最外層的 SELECT 標記為 PRIMARY(id 為 1)。
  • SUBQUERY:SELECT 列表中的子查詢(非 FROM 子句)。
  • DERIVED:FROM 子句中的子查詢(派生表)。
  • UNION:UNION 中第二個及後續的 SELECT。
  • UNION RESULT:從 UNION 臨時表檢索結果的 SELECT。

3. table 列

顯示該行正在訪問的表名。若 FROM 子句包含子查詢或 UNION,則顯示為 <derivedN>,N 對應 id 值。

4. type 列(訪問類型,由差到優排序)

這是判斷查詢效率的關鍵指標:

  • ALL:全表掃描,性能最差。
  • index:全索引掃描,按索引順序讀取而非行順序。
  • range:索引範圍掃描(如 BETWEEN、>、IN()、OR)。
  • ref:非唯一索引查找,返回匹配單個值的所有行(可能多行)。
  • eq_ref:唯一索引或主鍵查找,最多返回一行(如連接查詢中使用主鍵)。
  • const / system:優化器將查詢部分轉為常量(如主鍵精確匹配),極快。
  • NULL:優化階段即可確定結果,無需訪問表/索引(如 SELECT MIN(id) FROM t)。

5. possible_keys 列

查詢理論上可用的索引列表,基於查詢條件列和操作符判斷。

6. key 列

MySQL實際選擇使用的索引。若為 NULL,表示未使用索引。

7. key_len 列

索引中使用的字節數。可推斷聯合索引實際用了幾列。例如 INT 類型主鍵為 4 字節,SMALLINT 為 2 字節。

8. ref 列

顯示哪些列或常量被用於與 key 列記錄的索引進行比較查找。

9. rows 列

MySQL 預估為找到所需數據而需讀取的行數(統計信息估算值,非精確值)。

10. Extra 列

包含不適合在其他列顯示的額外信息,常見值:

  • Using index:使用覆蓋索引,僅訪問索引樹避免回表,性能極佳。
  • Using where:存儲引擎返回行後由 Server 層通過 WHERE 條件過濾。
  • Using temporary:查詢需使用臨時表(常見於 GROUP BY、DISTINCT、ORDER BY 優化失效)。
  • Using filesort:無法利用索引完成排序,需外部文件排序,性能較差。
  • Range checked for each record (index map: N):無合適索引,需對聯接每行重新評估索引。

掌握 EXPLAIN 各列含義,結合 type、key、rows、Extra 等關鍵指標,即可精準定位 SQL 性能瓶頸,指導索引優化與查詢重寫。

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