MySQL之Explain命令详解

MySQL之Explain命令详解

目录技术文章 2016年4月24日

explain命令是查看查询优化器如果决定执行查询的主要方法。

Explain的输出字段

MySQL之Explain命令详解

id列

SQL执行顺序的标识,SQL从大到小执行。

MySQL之Explain命令详解

select_type列

MySQL将SELECT查询分为简单和复杂类型,复杂类型可以分为三大类:简单子查询,FROM子句中子查询和UNION查询。select_type列显示了对应查询行是简单还是复杂的SELECT(如果是复杂的,属于哪一种)

1.SIMPLE类型,简单的SELECT,不包括UNION和子查询

MySQL之Explain命令详解

2.PRIMARY类型,如果查询有任何的复杂的字部分,最外层SELECT类型

MySQL之Explain命令详解

3.UNION类型,UNION查询中第二个开始后面所有的SELECT

MySQL之Explain命令详解

4.SUBQUERY类型,子查询中第一个SELECT

MySQL之Explain命令详解

5.DEPENDENT UNION类型,子查询中的UNION中的第二个开始后面所有的SELECT,依赖于外部查询的结果集

MySQL之Explain命令详解

6.DEPENDENT SUBQUERY类型, 子查询中第一个SELECT,依赖于外部的查询结果

MySQL之Explain命令详解

7.UNION RESULT类型,UNION的结果

MySQL之Explain命令详解

8.DERIVED类型,FROM子句的子查询

MySQL之Explain命令详解

table列

显示这次查询是基于哪个表,有时候显示的是derivedx, 代表第x步执行的结果

type列

访问的类型,即MySQL决定如何查找表中的行,类型从最好到最差依次为:system、const、eq_ref、ref、ref_or_null、index_merge、unique_subquery、index_subquery、range、index、ALL。

  • system/const类型

    当表最多只有一个匹配行,它将在查询时被读取并转换成一个常量时,使用const类型。const表很快,因为只读取一次。const常用于常数值比较主键或唯一索引索引的所有部分。system类型是const类型一种特例,在表仅有一行时使用。

MySQL之Explain命令详解

  • eq_ref类型

    对于来自前面表的行组合,从该表中读取一行,查询基于主键或唯一索引进行查找最多返回一行记录。MySQL对这种访问类型的优化做的非常好,因为它无需估计匹配行的范围或找到匹配行后再继续查找。

    如下图,基于users.id联接users和useraddrs表,查询计划是扫描useraddrs表,然后根据useraddrs.user_id对users表使用eq_ref类型对主键进行查找。

MySQL之Explain命令详解

  • ref/ref_or_null类型

    ref是一种索引访问,它返回所有匹配单个值得行,但查询不是基于主键或唯一索引进行的,所以它可能会返回多个符合条件的行。如果查询不能基于索引选择单行的话,则使用ref。ref_or_null类型是在ref初次查找的基础里进行第二次查询以找出NULL条目。

MySQL之Explain命令详解

  • index_merge类型

    使用索引合并优化方法,此情况下key列包含了使用的索引清单

MySQL之Explain命令详解

  • unique_subquery/index_subquery类型

    unqiue_subquery类型用于替换 value IN (SELECT primary_key FROM single_table WHERE some_expr), index_subquery用于替换value IN (SELECT column FROM single_table WHERE some_expr),两种唯一区别就是子查询中的查的分别是主键和非唯一索引

  • range类型

    使用索引来进行范围查询,常使用的操作符是>、>=、<、<=、Between,当MySQL使用索引去查找一些列值如IN和OR列表,也会显示为范围扫描,但在性能上是有很大区别的。

MySQL之Explain命令详解

  • index类型

    扫描索引树,当只查询作为索引字段的列时,使用此类型。

MySQL之Explain命令详解

  • ALL类型

    全表扫描,MySQL必须扫描整张表,从头到尾,去找到所需要的行。

MySQL之Explain命令详解

possible_keys列

显示了查询可以使用哪些索引,这是基于查询访问的列和使用比较操作符来判断的。

key列

显示了MySQL决定采用哪个索引来优化对该表的访问。如果没有选择索引,则显示为NULL。如果显示的索引没有在possible_keys列中出现,可能是因为它选择了一个覆盖索引(SELECT数据列从索引中就可获取,无需访问表数据)。

key_len列

显示了MySQL在索引中使用的字节数。

ref列

显示了之前表在key列记录的索引中查找值所用的列或常量(const)。

rows列

MySQL为了估计查找到所需的行数而要读取的行数,这个数字是内嵌循环关联计划里的循环数目,是MySQL为了找到符合查询的那些行而必须读取的行的平均数。

extra列

显示的是一些额外信息,常用的如下所示

  • Using index:MySQL使用覆盖索引以避免访问表
  • Using where:MySQL不能仅仅通过索引就能获取所有需要满足查询条件的数据
  • Using temporary:MySQL需要创建临时表来处理查询,这情况下说明需要优化
  • Using filesort:MySQL无法使用索引完成排序操作,而需要选择相应的排序算法在内存或磁盘上完成排序
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值