Mysql Explain Extra

512 阅读2分钟

内容

extra 是使用EXPLAIN后非常重要的一组信息,这里我将列举一下它所包含的内容

  1. Using filesort

说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为”文件排序”

这个要在什么情况下出现呢?

比如我为a表建立了索引,使用的是a表中的a1和a2字段,这个时候

// 首先为a建立索引
create index a1_a2 on a(a1,a2)
// 将a2作为条件排序
select * from a order by a2

这个时候就会出现上面的文件排序——既建立了索引,但是索引是复合索引,条件第一是a1,而如果直接使用a2作为排序条件,那么索引是失效的,因此会通过using filesort告诉用户这个索引的排序不被使用

  1. using temporary

如果出现了这个,那么说明情况很糟糕,表示数据库通过建立临时表将数据保存在临时表中。临时表是个中间过程,要创建然后销毁,这个过程是非常慢的。常见于使用了order by或者group by后面

下面我们就来看看什么情况下会出现使用临时表的情况

image.png

首先,我们可以看到这个建立的索引是col1,col2,col3这样的一个顺序,而第一条语句中直接group by col2,这样做建立的索引就完全没用,而且,这个过程要建一张临时表来存储group

  1. using index

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错! 如果同时出现using where,表明索引被用来执行索引键值的查找; 如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。

覆盖索引:就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。