explain sql语句 可以用来分析索引的一些情况:

idselect_typetabletypepossiable_keyskeykey_lenref

TYPE

显示子查询使用何种类型的查询

从最好到最差依次是:system > const > eq_ref > ref > rang > index > ALL

一般的优化需要达到 `rang` 级别,最好是 `ref` 级别

system

单个表中的一行记录,const 类型的特例,查询速度最快

const

通过索引一次就能找到,通常是查询主键查询或者唯一查询 (primay_key , unique)

eq_ref

唯一索引扫描,用索引查询出了一条记录 select * from users where phone = ''

ref

非唯一索引表,用到了索引查出了多条记录 select * from users where age = 18

range

查询出给定范围的行,这种范围扫描比全表扫描要好,因为它只需要开始与索引的某个点结束于索引的某个点,不用扫描全部索引。一般 where 后面出现了 ['between', 'in', '>', '<'] 的查询。key 列显示了使用了哪个索引。

index

查询整个索引,一般索引在内存中加载,数据量比全表扫描 (ALL) 小,而且不需要从硬盘查数据,因此比全表扫描要快。

all

全表扫描,从硬盘读取数据查询,IO 操作频繁,速度最慢。

POSSIABLE_KEYS

可能用到的索引,不一定被实际查询用到。

KEYS

在若干个可能用到的索引竞争中,最终选择了哪个索引。

如果为 NULL,则没有使用索引。

KEYS_LENG

索引字段使用的字节数。不损失精度的情况下越短越好。

REF

索引上哪些列被使用了。

ROWS

根据表统计信息以及索引选用情况,大致估算出找到所需要的记录需要读取的行数。

Extra

包含了不在上面列显示且十分重要的信息。

Using filesort

文件排序,MySQL 无法使用索引完成的排序成为“文件排序”。比较糟糕的情况。(九死一生)

如下图所示,查询用到了索引,遗憾的是排序没有用到索引。查询中的排序字段若用到了索引将大大提高排序速度。

mysql-explain-using-filesort.png

Using temporary

使用临时表保存中间结果,MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。非常非常糟糕的情况。临时表的创建非常消耗系统性能,需要把数据搬到临时表中处理后,还需要删除掉。(完蛋)

mysql-explain-temporary.png

Using index

表示相应 select 操作中使用了覆盖索引,避免访问数据表的行,效率不错!

Using where

使用了 where 条件筛选

Using join buffer

使用了连接缓存

Using impossible where

where 子句的结果总是 false,不能获取任何数据

mysql-explain-impossible-where.png

发表评论