mysql之explain详解(分析索引的最佳使用)

在这里对explain的各个字段进行详细的分析,来帮助你们分析本身所写的sql是否最佳的使用了索引。mysql

 

首先是select_type:将select查询分为简单(simple)和复杂两种类型sql

复杂类型又分为子查询(subquery)和from列表中包含子查询(drived)服务器

simple:优化

drived:blog

就type进行详细的介绍:排序

System,const,eq_ref,ref,range,index,all索引

all : 即全表扫描table

index : 按索引次序扫描,先读索引,再读实际的行,结果仍是全表扫描,主要优势是避免了排序。由于索引是排好的。file

range:以范围的形式扫描。select

explain select * from a where a_id > 1\G

ref:非惟一索引访问(只有普通索引)

create table a(a_id int not null, key(a_id));

insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

mysql> explain select * from a where a_id=1\G

eq_ref:使用惟一索引查找(主键或惟一索引)

const:常量查询

在整个查询过程当中这个表最多只会有一条匹配的行,好比主键 id=1 就确定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。

当结果不是一条时,就会变成index或range等其余类型

system:系统查询

null:优化过程当中就已经获得结果,不在访问表或索引

possible_keys:可能用到的索引

key:实际用到的索引

key_line:索引字段最大可能使用长度

ref:

指出对 key 列所选择的索引的查找方式,常见的值有 const, func, NULL, 具体字段名。当 key 列为 NULL ,即不使用索引时,此值也相应的为 NULL 。

rows:估计须要扫描的行数

Extra:显示以上信息以外的其余信息

Using index

此查询使用了覆盖索引(Covering Index),即经过索引就能返回结果,无需访问表。

若没显示"Using index"表示读取了表数据。

Using where

表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。由于检查是在读取行后才进行的,因此称为“后过滤”。

Using temporary

使用到临时表

建表及插入数据:

create table a(a_id int, b_id int);

insert into a values(1,1),(1,1),(2,1),(2,2),(3,1);

mysql> explain select distinct a_id from a\G
        Extra: Using temporary

MySQL 使用临时表来实现 distinct 操做。

 

Using filesort

若查询所需的排序与使用的索引的排序一致,由于索引是已排序的,所以按索引的顺序读取结果返回,不然,在取得结果后,还须要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort 。

select * from a order by id;

对于没有索引的列进行order by 就会出现filesort

相关文章
相关标签/搜索