文章目錄 一、執行計劃核心字段總覽 二、關鍵字段深度拆解 1. type(訪問類型)——查詢性能的晴雨表 2. key_len(索引使用長度)——索引利用率的檢測儀 3. Extra(附加信息)——隱藏的性能殺手 三、全字段詳解速查表 四、性能診斷四步法 第一步:檢查type等級 第二步:驗證索引使用 第三步:分析掃描行數 第四步:排查Extra警告 五、經典優化案例 六、高級分析技巧 1. JSON格式查看詳細成本 2. 索引長度驗證公式 3. 執行計劃可視化工具推薦 七、常見問題解決方案
一、執行計劃核心字段總覽
字段名 人類語言解釋 性能影響等級 type 數據訪問方式 ★★★★★ key 實際使用索引 ★★★★☆ rows 預估掃描行數 ★★★★☆ Extra 附加執行信息 ★★★★☆ key_len 使用索引的長度 ★★★☆☆
二、關鍵字段深度拆解
1. type(訪問類型)——查詢性能的晴雨表
性能從優到劣排序 : system
> const
> eq_ref
> ref
> fulltext
> range
> index
> ALL
典型場景分析:
EXPLAIN SELECT * FROM users WHERE id = 1 ;
EXPLAIN SELECT * FROM orders WHERE amount > 100 ;
2. key_len(索引使用長度)——索引利用率的檢測儀
計算公式 : 索引字段長度 × 字段數 + 預留字節
計算示例:
CREATE TABLE ` demo` ( ` id` INT ( 11 ) NOT NULL , ` name` VARCHAR ( 20 ) DEFAULT NULL , ` age` TINYINT ( 4 ) DEFAULT NULL , INDEX ` idx_name_age` ( ` name` , ` age` )
) ;
EXPLAIN SELECT * FROM demo WHERE name= '張三' AND age= 25 ;
EXPLAIN SELECT * FROM demo WHERE name= '李四' ;
3. Extra(附加信息)——隱藏的性能殺手
常見值解析:
值 含義 處理建議 Using index 使用覆蓋索引 保持當前優化 Using temporary 使用臨時表 檢查GROUP BY/ORDER BY字段 Using filesort 文件排序 添加合適索引 Using where 存儲引擎返回后過濾 檢查索引是否完整 Select tables optimized away 優化器已優化(如MIN/MAX查詢) 無需處理
三、全字段詳解速查表
字段名 含義 常見值示例 id 查詢序列號 1, 2(聯合查詢時數值不同) select_type 查詢類型 SIMPLE, PRIMARY, SUBQUERY table 訪問的表名 users, orders partitions 匹配的分區 p0, p1 type 訪問方式 const, ref, ALL possible_keys 可能使用的索引 idx_name, PRIMARY key 實際使用的索引 idx_age key_len 使用索引的長度 4, 62 ref 索引引用關系 const, db1.users.id rows 預估掃描行數 1, 10024 filtered 存儲引擎返回數據后,經過過濾剩余的比例 100.00 Extra 附加執行信息 Using index, Using temporary
四、性能診斷四步法
第一步:檢查type等級
- ? 目標:至少達到range級別
- ? 問題:出現ALL時需要緊急優化
- 💡 處理:添加合適索引
第二步:驗證索引使用
SHOW INDEX FROM users;
第三步:分析掃描行數
- 當rows > 10000時:可能存在全表掃描
- 優化案例:100萬行表查詢從2s優化到0.02s
第四步:排查Extra警告
1. 發現Using filesort → 檢查ORDER BY字段是否匹配索引
2. 出現Using temporary → 優化GROUP BY字段
3. 存在Using where → 檢查查詢條件是否完整使用索引
五、經典優化案例
案例1:索引失效分析
EXPLAIN SELECT * FROM orders WHERE YEAR ( create_time) = 2023 ;
EXPLAIN SELECT * FROM orders
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31' ;
案例2:覆蓋索引優化
EXPLAIN SELECT user_id FROM comments WHERE post_id= 100 ;
ALTER TABLE comments ADD INDEX idx_post_user( post_id, user_id) ;
六、高級分析技巧
1. JSON格式查看詳細成本
EXPLAIN FORMAT= JSON
SELECT * FROM products WHERE price > 100 ;
2. 索引長度驗證公式
VARCHAR(n):n*3+2
INT:4
TINYINT:1
DATETIME:5
允許NULL的字段:+1
3. 執行計劃可視化工具推薦
MySQL Workbench執行計劃可視化 Percona Toolkit的pt-visual-explain JetBrains DataGrip的圖形化展示
七、常見問題解決方案
癥狀 原因 解決方案 type=ALL 無可用索引 添加WHERE條件涉及的索引 Using filesort 排序字段不匹配索引 創建復合索引包含排序字段 key_len過短 未充分使用復合索引 檢查查詢條件順序 rows數值異常 統計信息過期 執行ANALYZE TABLE filtered=100 存儲引擎層未過濾數據 檢查索引覆蓋情況