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

MySQL 調優基礎篇:EXPLAIN 執行計劃深度解析與索引優化實戰

     編輯:MySQL 綜合教學

MySQL 作為開源關係型資料庫首選,廣泛應用於高併發互聯網業務。本系列將系統講解 MySQL 性能調優,首篇聚焦執行計劃(EXPLAIN)核心指標解讀與索引優化基礎。

技術環境

  • OS:Windows
  • MySQL:5.6
  • 樣本庫:sakila

一、EXPLAIN 基礎語法

EXPLAIN [EXTENDED] SELECT select_options

在待優化 SQL 前加 EXPLAIN,MySQL 將輸出查詢優化器的決策資訊,類似 SQL Server 的執行計劃但更輕量。

二、EXPLAIN 輸出欄位詳細解讀

1. select_type:查詢類型

值含義
SIMPLE單純 SELECT(無 UNION/子查詢)
PRIMARY最外層查詢
UNIONUNION 中第二或後續 SELECT
DEPENDENT UNION依賴外部查詢的 UNION
UNION RESULTUNION 結果集
SUBQUERY子查詢首個 SELECT
DEPENDENT SUBQUERY依賴外部查詢的子查詢
DERIVED衍生表(FROM 子句子查詢)

2. type:訪問類型(性能由高到低)

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • system/const:極快,主鍵/唯一索引精確查找。
  • eq_ref:連接查詢中使用主鍵/唯一索引全部鍵部分。
  • ref:非唯一索引或最左前綴匹配。
  • range:索引範圍掃描(BETWEEN、IN、> 等)。
  • index:全索引掃描(比全表掃描快)。
  • ALL:全表掃描,需優化首要目標。

調優目標:至少達到 range 級別,最佳達到 ref/eq_ref/const。

3. 關鍵欄位速查

欄位含義調優關注點
possible_keys理論可用索引是否包含預期索引
key實際使用索引NULL 表示無索引可用
key_len使用索引長度判斷聯合索引用了幾列
ref配合 key 的比較值常數或關聯表欄位
rows預估掃描行數越小越好,配合 type 判斷
Extra額外資訊Using index(覆蓋索引)、Using filesort、Using temporary 等

4. Extra 常見值與優化提示

  • Using index:覆蓋索引,僅讀索引不回表,極佳。
  • Using filesort:需額外排序,考慮索引優化 ORDER BY。
  • Using temporary:建立臨時表,GROUP BY/DISTINCT 優化方向。
  • Using where:WHERE 過濾,結合 type 判斷是否全表掃描後過濾。

三、實戰:索引優化前後對比

-- 建表
CREATE TABLE testOneRow (A INT, b VARCHAR(5));
INSERT INTO testOneRow VALUES (1, '111');

-- 無索引:type=ALL
EXPLAIN SELECT b FROM testOneRow;

-- 建立索引
CREATE INDEX index_b ON testOneRow (b);

-- 有索引:type=ref,rows=1,Extra=Using index
EXPLAIN SELECT b FROM testOneRow;

單一索引即將全表掃描轉為索引查找,行數從全表降為 1,展現索引核心價值。

四、總結與後續規劃

掌握 EXPLAIN 各欄位含義是調優入門鑰匙。後續將展開:
1. 索引架構原理(B+Tree、聚簇/輔助索引)
2. 複雜查詢重寫與聯接優化
3. 慢查詢日誌分析與參數調優
4. 鎖機制與事務併發優化

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