explain的含义和使用

本篇是从从MYSQL性能调优与架构设计108页摘录的,因为觉得很重要,所以放到博客里面。

说道Explain ,肯定很多读者之前都已经用过了 ,Mysql Query Optimizer 通过我们让它执行EXPLAIN命令来告诉我们它将使用一个怎么样的执行计划来优化我们的Query。所以,可以说,Explain是在优化Query时最直接有效的验证我们想法的工具。在本章前部分我就说过,一个好的SQL Performance Tuner在手动优化一个Query之前,头脑中就已经有了一个好的执行计划,后面的优化工作,只是为实现该执行计划而做出各种调整。

在我们对某个Query优化过程中,需要不断的使用Explain来验证我们的各种调整是否有效。就像本书之前的很多实例都会通过Explain来验证和展示结果一样,所有的Query 优化都应该充分的利用他。

我们先看一下在MySQL Explain功能中给我们展示的各种信息的解释:

  1. ID: Query Optimizer 所选定的执行计划中查询的序列号
  2. Select_type: 所使用的查询类型,主要有这几种查询类型
  • DEPENDENT SUBQUERY :子查询中内层的第一个SELECT,依赖于外部查询的结果集;
  • DEPENDENT UNION : 子查询中的UNION,且为UNION中从第二个SELECT开始的后面所有的SLEECT ,同样依赖于外部查询的结果集合。
  • PRIMARY:子查询中的最外层查询,注意并不是主键查询
  • SIMPLE :除了子查询或者是UNION之外的其他查询
  • SUBQUERY:子查询内层查询的第一个SELECT,结果并不一类与外部的查询结果集合;
  • UNCACHEABLE SUBQUERY:结果集无法缓存的子查询
  • UNION:UNION语句中第二个SELECT开始的后面所有的SELECT,第一个SELECT为PRIMARY。
  • UNION RESULT :UNION中的合并结果。

3. Table: 显示这一步所访问的数据库表的名称

4.Type:告诉我们对表所使用的访问方式,主要包含如下集合中的类型

  • all: 全表扫描
  • const:读常量,且最多只有一条记录匹配,由于是常量,同时实际上只需要读取一次,(ps:通过主键读取一般会给这个)
  • eq_ref:最多只会有一条匹配的结果,一般是通过主键或者是唯一索引来访问
  • fulltext:(ps:没有)
  • index:全索引扫描
  • index_merge: 查询中同时使用两个索引,然后对索引结果进行merge之后再读取。
  • index_subquery: 子查询中的返回结果字段组合是一个索引(或索引组合)但不是主键或者是唯一索引
  • range:索引范围扫描
  • ref:Join 语句中被驱动表索引引用查询
  • ref_or_null: 与ref的唯一区别就是在使用索引之外再增加一个空值的查询
  • system: 系统表,表中只有一个一样数据
  • unique_subquery:子查询中的返回结果字段组合是主键或者是唯一约束

5. Possible_keys: 该查询可以利用的索引,如果没有任何索引可以使用,就是显示成null,这一项内容对优化的时候索引的调整非常重要

6. Key:MySQL Query Optimizer 从possible_keys中所选择使用的索引

7. Key_len:  被所选中使用的索引的索引键长度

8: Ref:列出通过常量,还是某个表的某个字段来过滤的

9:Rows: MySQL Query Optimizer 通过系统收集到的统计信息估算出来的结果集记录条数,

10:Extra:查询中每一步实现的额外细节信息,主要可能会是一下的内容

  • Distinct:查找distinct值,所以当mysql找到第一个匹配的结果之后,将停止该值的查询而转为后面其他值的查询
  • Full scan on NULL key:子查询中的一种优化方式,主要是遇到无法通过所以访问null值的时候使用。
  • Impossible Where noticed after reading const tables:MySQL Query Optimizer通过收集到的统计信息判断出不可能存在的结果
  • No tables:Query语句使用的From dual 或者不包含任何from字句
  • Not exists: 在某些做链接中的Mysql Query Optimizer 所通过改变原有的Query的组成而使用的办法,可以不犯减少数据访问的次数(ps:表示怀疑)
  • Range checked for each record:通过Mysql官方手册描述,当MySQL Query Optimizer 没有发现好的可以使用的索引的时候,如果发现如果来自前面的表的列值已知,可以部分所以可以使用,对前面的表的每个行进行组合,MySQL检查是否可以使用range,index_merge访问方法来索取行
  • Select tables optimized away :当我们使用的某些聚合函数来访问存在索引的某个字段的时候,MySQL Query Optimizer 会通过索引而直接一次定位到所需的数据行完成整个查询。当然,前提是在Query中不能有GROUP BY操作。如使用min()或者是max()的时候
  • Using filesort :当我们的Query中包含ORDER BY操作,而且无法利用索引完成排序操作的时候,MySQL Query Optimizer不得不选择相应的排序算法来实现。
  • Using index:所需要的数据只需要在Index即可获得而不需要到表中取数据。
  • Using index for group-by :数据访问和Using index 一样,所需要的数据读取索引即可。而当Query中使用了GROUP BY或者是DISTINCT子句的时候,如果分组字段也索引中,Extra中的信息就会使using index for group-by
  • Using temporary: 当MYSQL在某些操作中必须使用临时表的时候,在Extra信息中就会出现Using temporary .主要常见于GROUP BY 和 ORDER BY等操作中。
  • Using where : 如果我们不是读取标的所有的数据,或者不仅仅是通过索引就可以获取所需要的数据,就会出现Using where 信息。
  • Using where with pushed condition: 这是一个仅仅在NDCluster存储引擎中才会出现的信息,而且还需要通过打开Condition Pushdown优化才可能被使用,控制参数为engine_condition_pushdown。

 

Leave a comment

Your email address will not be published.

*