explain

168 阅读2分钟

1.id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行

1.select_type表示对行是简单还是复杂的查询

**simple:简单的查询不包含子查询 **

**primary:复杂查询中的最外层查询 **

subquery:包含在select中的子查询(不再from子语句中)

derived:包含在from子语句中的查询。mysql将结果放到一个临时表中,也称为派生表

2.table 表示 explain 的一行正在访问哪个表

当from子句中有子查询时,table列是 derivenN 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id

3.type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL一般来说,得保证查询达到range级别,最好达到ref

NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表

Systrm:表里只有一条元素匹配时为system

const:主键或者唯一索引查询

eq_ref:主键或者唯一索引的所有部分被连接使用

ref:二级索引(非唯一索引)查询

range:索引范围查询

index:扫描全索引(这里一般是二级索引),这种查询一般为使用覆盖索引

all:即全表扫描,扫描你的聚簇索引的所有叶子节点

4.Extra

Using index:索引覆盖

Using where:普通查询未使用索引

Using index condition:使用索引查询了,但是没有索引覆盖

Using temporary:临时表查询,未走索引

Using filesort:排序未走索引