Mysql面试全解(三)

96 阅读2分钟

「这是我参与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,这个值还没理解,经过实战发现网上说的好多都是错的,所以还没总结,后续补充