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详解的主要内容,如果未能解决你的问题,请参考以下文章