「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」
Explain
目的就是为了检查查询语句的索引命中情况,从而来进行索引优化或者查询条件的优化
下面对几个重要的参数进行解释
1、select_type,select子句的查询类型,主要用来在进行子查询或者合并查询的时候区分进行的哪条查询
-
Simple:普通情况,未使用子查询或者union查询(合并查询结果数据使用)
-
primary:子查询的最外层查询/union最前面的那个查询
-
UNION:合并的后面那个子句
-
dependent union:第二个union的查询结果依赖于第一个查询结果
-
union result:合并的操作
-
subquery:子查询中的第一个select,结果不依赖外部
-
dependent subquery:子查询中的第一个select,结果依赖外部
-
DERIVED:
-
UNCACHEABLE SUBQUERY
2、type
-
ALL:该操作进行了全表遍历
出现的情况
- 查询的操作就是要查询出来全表的所有数据,比如id>0
- 查询的操作字段没有索引,比如operator='小红'
- 查询的操作字段有索引,但是没有命中,比如first_class=1(不符合最左前缀原则)
这种ALL的操作很耗时,需要优化
-
index:遍历了索引树,但是没有回表。效率要比ALL高很多,因为回表的消耗会很大
-
range:基于索引的范围查找,也就是在索引上进行了范围查找
<,>,between,in,or等操作 -
ref:命中索引查找,但是查找值不唯一。
-
ref_eq:命中了唯一索引/主键索引,查找值唯一
-
const:命中主键索引
3、possible_keys,表示命中的索引(有可能会命中多个,比如idx_orderNo,idx_orderNo_num)等
4、Key,表示真正使用的那个索引,必然在possible_keys其中一个
5、key_len,一般表示索引列的类型长度
6、rows,表示查询到目标值需要遍历的数据量
7、ref,表示哪些列、常量被来用来查询索引上的值
8、filtered,TODO查了很多情况说这个是目标行数占检索总行数的百分比。但是好像不太多,目前还没理解为什么。
9、Extra,这个值还没理解,经过实战发现网上说的好多都是错的,所以还没总结,后续补充