怎么分析一条 SQL 语句是否走了索引?
目录
- 一、判断sql走没走索引?
- 二、type、key、extra 字段
- 三、总结
首先清楚EXPLAIN是 MySQL 优化器的 “执行计划说明书”—— 模拟执行 SQL,告诉你 MySQL 会怎么查数据(走不走索引、走哪个索引、怎么扫数据),调优的核心就是看这份 “说明书”。
EXPLAIN
SELECT *
FROM name
WHERE name = '123';
-- 输出有3个字段 type、key、extra
一、判断sql走没走索引?
走索引:key 字段不为 NULL + type 字段不是 ALL/index;
没走索引:key 字段为 NULL + type 字段是 ALL(全表扫描)。
二、type、key、extra 这三个字段,并理解其输出字段的含义。
1、type(MySQL 查找数据的方式)
type表示 MySQL 查找数据的方式,类型有:
| 类型 | 通俗解释 | 是否走索引 | 效率 |
|---|---|---|---|
| ALL | 全表扫描(逐行找数据) | 否 | 最差 |
| index | 全索引扫描(扫整个索引,不扫表) | 是 | 较差 |
| range | 索引范围扫描(如 where id>10) | 是 | 中等 |
| ref | 非唯一索引等值匹配(如 where name='张三') | 是 | 较好 |
| eq_ref | 唯一索引等值匹配(如主键 where id=1) | 是 | 最好 |
核心:只要 type 不是 ALL/index,就是 “有效走索引”;type 越靠后,查询效率越高。
2、key(实际用到的索引名)
key是实际用到的索引名:NULL(没走索引) 或者 索引名。
3、extra(额外信息)
Extra是额外信息(判断 “索引用得好不好”)
| 取值 | 通俗解释 | 优化建议 |
|---|---|---|
| Using index | 覆盖索引(只查索引列,不用回表) | 最优,不用优化 |
| Using where | 用 where 过滤数据 | 若 type=ALL,就是全表扫后过滤,差 |
| Using filesort | 文件排序(没走索引排序) | 要优化(加排序索引) |
| Using temporary | 创建临时表(如 group by 没走索引) | 要优化(加分组索引) |
| Using index condition | 索引下推(MySQL 优化手段) | 正常,不用改 |
三、总结
判断是否走索引:核心看 key 是否非 NULL,type 是否不是 ALL;
判断索引是否高效:type 越优(eq_ref/ref/range)+ Extra 无 filesort/temporary,就是高效;
Extra 优:Using index(覆盖索引);差:filesort/temporary(必须优化)。