文章目录
一、执行计划核心字段总览 二、关键字段深度拆解 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 存储引擎层未过滤数据 检查索引覆盖情况