在我们使用explain命令对sql语句进行优化时,有一些参数比较重要但也有点不容易理解。接下来就对他们分别进行介绍。
1. type
type表示此次sql语句的访问类型,可以从总体上反应该语句的运行情况。
从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL
一般来说,查询要至少达到range级别,最好达到ref。
-
system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计。 -
const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转化为一个常量。 -
eq_ref:唯一性索引扫描,读取本表中和关联表表中的每行组合成的一行,查出来只有一条记录。除 了system和const类型之外, 这是最好的联接类型。 -
ref:非唯一性索引扫描,返回本表和关联表某个值匹配的所有行,查出来有多条记录。 -
range:只检索给定范围的行,一般就是在WHERE语句中出现了BETWEEN、< >、in等的查询。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引树的某一点,而结束于另一点,不用扫描全部索引。 -
index:Full Index Scan,全索引扫描,index和ALL的区别为index类型只遍历索引树。也就是说虽然ALL和index都是读全表,但是index是从索引中读的,ALL是从磁盘中读取的。 -
ALL:Full Table Scan,没有用到索引,全表扫描。
这里着重解释一下index与all。
index表示在进行数据查询时,其实我们也用不到index来直接帮助我们快速找到所需的数据。我们也需要进行遍历,但由于该数据列我们创建了索引,因此我们可以遍历索引,不需要遍历数据表。索引的大小通常比整个表要小得多,I/O操作次数也会减少,那么就会有更快的查询速度。
2. Extra
Extra包含不适合在其他列中显示但十分重要的额外信息。
Using filesort:说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作成为"文件内排序"。
Using temporary:使用了临时表保存中间结果,MySQL在対查询结果排序时使用了临时表。常见于排序order by和分组查询group by。临时表対系统性能损耗很大。
Using index:表示相应的SELECT操作中使用了覆盖索引,避免访问了表的数据行,效率不错!如果同时出现Using where,表示索引被用来执行索引键值的查找;如果没有同时出现Using where,表明索引用来读取数据而非执行查找动作。Using where:表明使用了WHERE过滤。Using join buffer:使用了连接缓存。impossible where:WHERE子句的值总是false,不能用来获取任何元组。
在extra中,通常我们需要解决Using filesort与Using temporary