MYSQL之explain详解

Posted 敲代码的小小酥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL之explain详解相关的知识,希望对你有一定的参考价值。

一、table

单表表名,联表查询会有多条数据,一条数据table只有一个值。

二、 id

虽然说多表查询,explain会返回多条数据,但是,只要对应一个select,那么id就相同。即一个select,对应一个一样的id。只有多个select时,id值才有多个

三、select_type

每个select语句在整个sql中扮演的角色是什么。

  • PRIMARY:

主要的,就是最外层的sql查询

  • SIMPLE:

最简单的,没有子查询的sql和没用union的

  • SUBQUERY:

子查询

四、type

我们优化sql时,最少达到range级别,最好达到ref级别。
结果值从好到坏依次是:
system>const>eq_ref>ref>fulltext>range>index>all。
这里解释几个常见的:

  • const:
    根据主键或唯一二级索引列与常数进行等值匹配时,如:select * from table where id=‘xxx’
  • eq_ref:
    在连接查询时(内连接,左连接,右连接),如果被驱动表(被连接表)是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表访问方法就是eq_ref。
  • ref:
    :通过普通二级索引列与常量进行等值匹配来查询某个表,对该表的访问方式就是ref。注意是等值匹配,=号, in和between等都不行。
  • index_merge:
    索引合并,就是把两个二级索引合并成一个去执行sql了。
  • range:
    使用索引获取范围区间的记录,如between,<,>,in等。
  • index:
    在遍历完所有的二级索引之后,使用了索引覆盖的,就是index。意思就是联合索引中,没有遵循最左原则,where条件用了联合索引中间的值,然后select的列里都是联合索引的列,那么就会全部扫描索引,然后返回结果。因为没遵循最左原则,所以要扫描全部的索引,查找合适的值。如果select的列里,有不是索引的列出现,那么就会是all,而不是index。这个叫索引下推。
    索引下推就是没遵循最左原则,但是涉及到的列,都是联合索引的列,那么,就从这个联合索引中去全部扫描数据,进行数据查询,这样效率肯定比全表扫描高点儿。这种情况,like的%在左边,也会走索引下推。因为这样扫描信息量肯定比扫描全部信息量低。
  • all:
    全表扫描

五、key

sql语句最终使用的索引列

六、ref

当type是ref,ref_eq等值匹配的类型时,ref表明做等值匹配的是一个常量const还是一个函数hunc。不是等值匹配的ref列没值。

七、Extra

额外的信息,包括:

  • Impossible where:

查询语句的where子句永远为false

  • using index:

使用了索引覆盖,就是using index

  • using index condition:

在联合索引中,当根据最左列的索引定位到范围后,如果sql中还有右侧列的查询条件,根据右侧列的条件在联合索引上继续筛选了数据,就显示using index condition

  • using where:

当sql中用了非索引进行过滤的时候,显示using where。也就是过滤数据的时候,没有通过二级索引,来过滤条件,则就是using where。

  • using join buffer:

连接查询时,被驱动表不能利用索引加快访问速度,显示这个。

  • using filesort:

当 order by的字段不是索引时,就需要进行文件排序了。这个过程是很慢的。

  • using temporary:

使用临时表进行sql的处理,一般和using filesort一起出现。一般group by,order by有可能会出现。这个性能也很慢

以上是关于MYSQL之explain详解的主要内容,如果未能解决你的问题,请参考以下文章

( 转 ) MySQL高级 之 explain执行计划详解

MySQL高级 之 explain执行计划详解

MySQL高级 之 explain执行计划详解

MySQL高级 之 explain执行计划详解

MYSQL之explain详解

MySQL优化之索引篇: Explain工具