😺 什么是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
:用到了二级索引,相当于走了索引的