阅读 186

Explain 参数解析

Explain 参数解析

前言

  在使用Mysql,校验查询语句以及优化查询时会经常接触到 Explain 语句,用法比较简单,下面就解析出来的结果参数分别说明其含义

explain select * from order_detail_extension_7 where target_no = '202104112309741800301147019';

  了解Explain参数具体含义之前,先要看下Mysql的层次结构,便于之后的理解

 

  最上层是大多数基于网络的客户端、服务器的工具或者服务都有类似的架构,比如:授权、线程重复使用(连接池)、连接限制、缓存等。第二层包含了许多Mysql的核心功能:查询解析、分析、优化、缓存等。第三层是Mysql的存储引擎,比如:Innodb。

 

Explain参数

1、Explain简介:

 

  EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法,使用EXPLAIN,只需要在查询中的SELECT关键字之前增加EXPLAIN这个词即可,MYSQL会在查询上设置一个标记,当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是执行它,它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序,从而可以从分析结果中找到查询语句或是表结构的性能瓶颈。

2、id

  id代表执行select 子句或操作表达数顺序。会有三种不同的执行结果,分别是

  • id相同,执行顺序由上至下

explain select om.order_no from order_master_0 om left join order_extension_0 oe on om.order_no=oe.target_no where om.id > 60000;

 

 

  •  id不同,如果是子查询,id的序号会递增,id越大优先级越高,越先被执行

explain select * from order_master_0 where order_no = (select order_no from order_master_0 where id = 60877);

 

 

  •  id相同和不同,同时存在,遵从优先级高的优先执行,优先级相同的从上往下顺序执行

explain select o.order_no,o.order_time from (select order_no,order_time from order_master_0 where id > 60000) o left join order_extension_0 oe on o.order_no = oe.target_no;

 

 

 3、select_type

  查询的类型,主要用于区分普通查询、联合查询、子查询等复杂查询

  • SIMPLE:简单的select查询,查询中不包含子查询或者union查询

  • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY

  • SUBQUERY:select或者where列表中包含子查询

  • DERIVED:from列表中包含的子查询被标记为DERIVED,mysql会递归这些子查询,将结果放在临时表中

  • UNION:做第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为derived

  • UNION RESULT:从union表获取结果的select

4、table

  显示查询的数据是关于哪张表的

5、type

  查询的类型,从最好的到最差的依次为:system > const > eq_ref > ref > range > index > ALL,一般情况下,至少要保证达到 range 级别,最好可以达到 ref 级别。

  • system:表只有一行记录,这是const类型的特例,平时不会出现

  • const:通过索引一次就查找到了,const即常数,用于比较primary和unique索引,因为只匹配一行数据,所以效率很快

explain select * from order_master_0 where id = 60876;

 

 

  • eq_ref:唯一性索引扫描,对于索引字段的值,表中只有一条记录与之匹配,常见于主键和唯一性索引扫描

  • ref:非唯一性索引扫描,可能返回多条数据

  • range:只检索给定范围的行,使用一个索引来选择行,比如:where语句中的between、<>、in等查询,这种范围性查询比全表扫描要好,因为只需要匹配索引的开始点和结束点就行(B+树的叶子节点是有序的),不用扫描全部索引。

  • index:只遍历索引树,这通常要比All快,因为索引文件通常比数据文件小。index是从索引中查询,ALL是从磁盘。

  • ALL:全表扫描,最差的一种查询类型。

6、possible_keys

  显示查询可能使用到的表中的索引,最终并不一定使用

  

 

 

 7、key

  查询时实际使用的索引,如果是NULL,则没有使用索引,因此可能出现,possible_keys列有可能被使用的索引,但是key为null的情况。

8、key_len

  表示索引中使用的字节数,而通过该列计算查询中使用的 索引长度,在不损失精确性的情况下,长度越短越好,key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即,key_len是根据表定义计算而得么不是通过表内检索出的

9、ref

  显示索引的哪一列被使用了,如果可能的话是一个常数,哪些列或常量被用于查找索引列上的值

10、Extra

  • Using filesort:mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取

explain select * from order_2b_0 where user_id = 'd1db4cb3028e93d0d47c2b5997550907' order by order_time desc;

 

 

  •  Using temporary:使用了临时表保存中间结果,mysql对查询结果排序时使用临时表,常见于order by和group by

explain select * from  (select * from order_2b_0 where user_id = 'd1db4cb3028e93d0d47c2b5997550907' order by id desc) o GROUP BY o.id;

 

 

  •  Using index:表示相应的select 操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现 Using where,表示索引被用来执行索引键值的查询;如果没有同时出现 Using where,表示索引用来读取数据而非执行查找。

explain select user_id,order_time from order_2b_0 where user_id = 'd1db4cb3028e93d0d47c2b5997550907' order by order_time desc;

 

 

  • Using where:表示使用了 where 过滤

  • Using join buffer:表示使用了连接缓存,如在查询的时候有多次 join,则可能会产生临时表

  • impossible where:表示where 子句的值总是false,不能用来获取任何数据

  • select tables optimized away:在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

  • distinct:优化distinct 操作,在查找第一匹配的数据后停止找同样值的动作。

参考:https://blog.csdn.net/zh15732621679/article/details/80394790


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐