MySQL 作為開源關係型資料庫首選,廣泛應用於高併發互聯網業務。本系列將系統講解 MySQL 性能調優,首篇聚焦執行計劃(EXPLAIN)核心指標解讀與索引優化基礎。
EXPLAIN [EXTENDED] SELECT select_options
在待優化 SQL 前加 EXPLAIN,MySQL 將輸出查詢優化器的決策資訊,類似 SQL Server 的執行計劃但更輕量。
| 值 | 含義 |
|---|---|
| SIMPLE | 單純 SELECT(無 UNION/子查詢) |
| PRIMARY | 最外層查詢 |
| UNION | UNION 中第二或後續 SELECT |
| DEPENDENT UNION | 依賴外部查詢的 UNION |
| UNION RESULT | UNION 結果集 |
| SUBQUERY | 子查詢首個 SELECT |
| DEPENDENT SUBQUERY | 依賴外部查詢的子查詢 |
| DERIVED | 衍生表(FROM 子句子查詢) |
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
BETWEEN、IN、> 等)。調優目標:至少達到 range 級別,最佳達到 ref/eq_ref/const。
| 欄位 | 含義 | 調優關注點 |
|---|---|---|
| possible_keys | 理論可用索引 | 是否包含預期索引 |
| key | 實際使用索引 | NULL 表示無索引可用 |
| key_len | 使用索引長度 | 判斷聯合索引用了幾列 |
| ref | 配合 key 的比較值 | 常數或關聯表欄位 |
| rows | 預估掃描行數 | 越小越好,配合 type 判斷 |
| Extra | 額外資訊 | Using index(覆蓋索引)、Using filesort、Using temporary 等 |
-- 建表 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. 鎖機制與事務併發優化