[MySQL面试]分析一条 SQL 语句是否走了索引?

5 阅读2分钟

怎么分析一条 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(必须优化)。