😺 什么是Explain
-
使用
Explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。通过Explain可以知道表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。在select语句之前增加explain关键字 ,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息
😺 Explain 面容
😈 😈 如何执行 Explain
EXPLAIN SELECT * FROM tb_article;
😈 😈 结果展示

😺 各字段详解
partitions和filtered对于开发人员来说,分析的意义不大,暂且略掉
😈 😈 id列
id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。id列越大执行优先级越高id相同则从上往下执行id为NULL最后执行
😈 😈 select_type列
表示简单还是复杂的查询
- 1)
simple:简单查询。说明没有子查询和union - 2)
primary:复杂查询中,最外层的select - 3)
subquery:包含在select中的子查询 - 4)
derived:包含在from中的子查询
explain
select 1⃣️
( select 1 2⃣️
from tb_coffee
where id = 1)
from ( 3⃣️ select * from film where id = 1 ) t1 ;
通过SQL可以得到:
- 1为
primary - 2为
subquery - 3为
derived
😈 😈 table 列
这一列表示 explain 的一行正在访问哪个表
😈 😈 type列 (非常关键的列!)
这一列表示访问类型,也就是mysql 查当前行底层是如何执行的
最优到最差排序:NULL > system > const > eq_ref > ref > range > index > ALL
🌈🌈🌈 NULL
虽然是 NULL ,但他是最🐮👃的,mysql 直接在优化阶段就能拿到值,压根儿都不需要访问表或者走索引
explain select max(id) from tb_article;

🌈🌈🌈 const:
顾名思义,就像查常量一样。可以理解为常量查询、结果集只有一条,查询效率非常高,比如说:主键索引,唯一索引等
🌈🌈🌈 system:
首先他的优先级是比 const 还要高的。他算作const的一种特例。从一张表去查询,而且这张表只有一条记录。
🌈🌈🌈 eq_ref:
简单理解就是通过主键关联或唯一键关联,我只会查询一条记录,效率也是非常高的
🌈🌈🌈 ref:
不使用唯一索引,而是使用普通索引或者是联合索引的前缀查询出来的结果集,有多个行记录
🌈🌈🌈 range:
效率还可以,相当于也是用到了索引查找,但是他查的是一个范围。但是对于结果集太大,效率也不是太高,所以建议做分页这些操作
🌈🌈🌈 Index:
Index 表示【全索引扫描】。扫的是二级索引(非主键索引)
🌈🌈🌈 ALL:
地球人都知道吧,ALL,全表扫描。扫的是聚簇索引所以的叶子节点,也就是data 数据,叶子节点
😈 😈 possible_keys列
- 人话讲:可能会用到的索引!
😈 😈 key 列
mysql真正执行的时候用到的索引
🌈🌈🌈 为什么有时候possible_keys列有值,但是keys为NULL
- 索引选择他内部有些成本计算的,有可能他分析的情况下会用到索引,但真正计算的时候不走索引还快一点。就类似于:我用全表扫描,效率可能还高一点
😈 😈 key_len列
-
这一列显示了
mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。 -
比如说我创建了一个 联合索引
idx_name_age('name'、'age')那么通过key_len就可以知道我这个联合索引是只用了name一个索引还是age这两个索引都用上了,这样就有利于我们对于索引是否命中可进行具体分析
😈 😈 ref 列
- 就是索引关联查询的这个字段,表示查找值所用到的列或者常量,常见有:
const(常量)、字段名
😈 😈 rows列
-
这一列是
mysql估计要读取并检测的行数,注意这个不是结果集里的行数。这个行数只能作为一个参考值,并不是扫描多的就比行数扫描少的效率低。 -
举个例子:有可能走索引他会扫描4万多行,不走索引全表扫描9万多行,但实际mysql底层不一定会选走索引的,他有一套自己的计算规则(
cost计算成本),有可能你走索引还需要回表啥的,还更慢!所以rows列的数据只能作为参考
😈 😈 Extra列
这一列展示的是额外信息,Extra列意义不是很大,以下列举几个常见的:
🌈🌈🌈 Using Index 覆盖索引
他并不是索引,他只是查询的一种方式。【覆盖索引 约等于 索引树】他表示我们要查找的结果字段,在索引树里面全部都包含,我只需要索引树就能查找到结果了,不需要回表。比如说type = index实际上他就是覆盖索引的方式进行查询
- 索引树本身就是排好序的
🌈🌈🌈 Using Where
- 用到了
where条件,最普通的查询。一般这种优化策略就是加个索引
🌈🌈🌈 Using filesort
- 用到了这个
表示是没有走索引的哈,他用的是聚簇索引,也就是整张表,整个叶子节点的数据
🌈🌈🌈 Using Index 和 Using filesort 差别
不管 Using Index 还是 Using filesort,他都是从磁盘加载到RAM,索引树也是在磁盘上的
Using filesort:直接是聚簇索引,没有用到索引树,扫描的是全表,聚簇索引包含叶子节点Using Index:用到了二级索引,相当于走了索引的

Explain是MySQL中用于分析SQL查询执行计划的工具,它可以帮助开发者了解查询如何执行,包括表的读取顺序、数据读取操作类型、索引使用情况等。通过id、select_type、table、type等列,可以深入理解查询的执行策略。例如,const表示常量查询,eq_ref表示主键或唯一键关联,而ALL则表示全表扫描。rows列显示预计扫描的行数,而Extra列提供如UsingIndex(覆盖索引)和UsingFilesort(未使用索引的排序)等额外信息。
836

被折叠的 条评论
为什么被折叠?



