mySQL数据库Sql语句执行效率检查--Explain命令

EXPLAIN Output Columns

列名 说明
id 执行编号,标识select所属的行。若是在语句中没子查询或关联查询,只有惟一的select,每行都将显示1。不然,内层的select语句通常会顺序编号,对应于其在原始语句中的位置
select_type 显示本行是简单或复杂select。若是查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)
table 访问引用哪一个表(引用某个查询,如“derived3”)
type 数据访问/读取操做类型(ALL、index、range、ref、eq_ref、const/system、NULL)
possible_keys 揭示哪一些索引可能有利于高效的查找
key 显示mysql决定采用哪一个索引来优化查询
key_len 显示mysql在索引里使用的字节数
ref 显示了以前的表在key列记录的索引中查找值所用的列或常量
rows 为了找到所需的行而须要读取的行数,估算值,不精确。经过把全部rows列值相乘,可粗略估算整个查询会检查的行数
Extra 额外信息,如using index、filesort等

id

id是用来顺序标识整个查询中SELELCT 语句的,在嵌套查询中id越大的语句越先执行。该值可能为NULL,若是这一行用来讲明的是其余行的联合结果。mysql

select_type

表示查询的类型算法

类型 说明
simple 简单子查询,不包含子查询和union
primary 包含union或者子查询,最外层的部分标记为primary
subquery 通常子查询中的子查询被标记为subquery,也就是位于select列表中的查询
derived 派生表——该临时表是从子查询派生出来的,位于form中的子查询
union 位于union中第二个及其之后的子查询被标记为union,第一个就被标记为primary若是是union位于from中则标记为derived
union result 用来从匿名临时表里检索结果的select被标记为union result
dependent union 顾名思义,首先须要知足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询
subquery 子查询中第一个SELECT语句
dependent subquery 和DEPENDENT UNION相对UNION同样

table

对应行正在访问哪个表,表名或者别名sql

  • 关联优化器会为查询选择关联顺序,左侧深度优先
  • 当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列
  • 当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id

注意:MySQL对待这些表和普通表同样,可是这些“临时表”是没有任何索引的。缓存

type

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,通常来讲,得保证查询至少达到range级别,最好能达到ref。服务器

类型 说明
All 最坏的状况,全表扫描
index 和全表扫描同样。只是扫描表的时候按照索引次序进行而不是行。主要优势就是避免了排序, 可是开销仍然很是大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小不少
range 范围扫描,一个有限制的索引扫描。key 列显示使用了哪一个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操做符,用常量比较关键字列时,可使用 range
ref 一种索引访问,它返回全部匹配某个单个值的行。此类索引访问只有当使用非惟一性索引或惟一性索引非惟一性前缀时才会发生。这个类型跟eq_ref不一样的是,它用在关联操做只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref能够用于使用=或<=>操做符的带索引的列。
eq_ref 最多只返回一条符合条件的记录。使用惟一性索引或主键查找时会发生 (高效)
const 当肯定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它并且只读取一次,所以很是快。当主键放入where子句时,mysql把这个查询转为一个常量(高效)
system 这是const链接类型的一种特例,表仅有一行知足条件。
Null 意味说mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效)

possible_keys

显示查询使用了哪些索引,表示该索引能够进行高效地查找,可是列出来的索引对于后续优化过程多是没有用的ide

key

key列显示MySQL实际决定使用的键(索引)。若是没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。oop

key_len

key_len列显示MySQL决定使用的键长度。若是键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的状况下,长度越短越好 。性能

ref

ref列显示使用哪一个列或常数与key一块儿从表中选择行。优化

rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。orm

Extra

Extra是EXPLAIN输出中另一个很重要的列,该列显示MySQL在查询过程当中的一些详细信息,MySQL查询优化器执行查询的过程当中对查询计划的重要补充信息。

类型 说明
Using filesort MySQL有两种方式能够生成有序的结果,经过排序操做或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并非说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分状况下利用索引排序更快,因此通常这时也要考虑优化查询了。使用文件完成排序操做,这是多是ordery by,group by语句的结果,这多是一个CPU密集型的过程,能够经过选择合适的索引来改进性能,用索引来为查询结果排序。
Using temporary 用临时表保存中间结果,经常使用于GROUP BY 和 ORDER BY操做中,通常看到它说明查询须要优化了,就算避免不了临时表的使用也要尽可能避免硬盘临时表的使用。
Not exists MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就再也不搜索了。
Using index 说明查询是覆盖了索引的,不须要读取数据文件,从索引树(索引文件)中便可得到信息。若是同时出现using where,代表索引被用来执行索引键值的查找,没有using where,代表索引用来读取数据而非执行查找动做。这是MySQL服务层完成的,但无需再回表查询记录。
Using index condition 这是MySQL 5.6出来的新特性,叫作“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操做的,可是如今能够了,这样减小了没必要要的IO操做,可是只能用在二级索引上。
Using where 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层之后再应用WHERE条件过滤。
Using join buffer 使用了链接缓存:Block Nested Loop,链接算法是块嵌套循环链接;Batched Key Access,链接算法是批量索引链接
impossible where where子句的值老是false,不能用来获取任何元组
select tables optimized away 在没有GROUP BY子句的状况下,基于索引优化MIN/MAX操做,或者对于MyISAM存储引擎优化COUNT(*)操做,没必要等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct 优化distinct操做,在找到第一匹配的元组后即中止找一样值的动做

原文连接:https://www.jianshu.com/p/ea3fc71fdc45  

相关文章
相关标签/搜索