在我们使用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