听说你对explain 很懂?(三)
eq_ref
通常通过主键索引或者唯一索引查询时会看到eq_ref,它最多只返回一条数据。user_id是唯一索引,为了测试就关联以下主键索引。
ref
也是通过索引查找,但是和eq_ref不同,ref可能匹配到多条符合条件的数据,比如最左前缀匹配或者不是主键和唯一索引。
最简单的办法,随便查一个普通索引就可以看到。
fulltext
使用FULLTEXT索引
ref_or_null
和ref类似,但是还要进行一次查询找到NULL的数据。
这相当于是对于IS NULL查询的优化,如果表数据量太少的话,你或许能看到这里类型是全表扫描。
index_merge
索引合并是在Mysql5.1之后引入的,就像下面的一个OR查询,按照原来的想法要么用name的索引,要么就是用age的索引,有了索引合并就不一样了。
对于这种单表查询(无法跨表合并)用到了多个索引的情况,每个索引都可能返回一个结果,Mysql会对结果进行取并集、交集,这就是索引合并了。
unique_subquery
按照官方文档所说,unique_subquery只是eq_ref的一个特例,对于下图中这种in的语句查询会出现以提高查询效率。
由于Mysql会对select进行优化,基本无法出现这个场景,只能用update这种语句了。
index_subquery
和unique_subquery类似,只是针对的是非唯一索引。
range
看名字就知道,范围查询,其实就是带有限制条件的索引扫描。
常见的范围查询比如between and,>,<,like,in 都有可能出现range。
index
跟全表扫描类似,只是扫表是按照索引顺序进行。
ALL
全表扫描,没啥好说的。
possible_keys
可以使用哪些索引。
key
实际决定使用哪个索引。
key_len
索引字段的可能最大长度,不是表中实际数据使用的长度。
ref
表示key展示的索引实际使用的列或者常量。
rows
查询数据需要读取的行数,只是一个预估的数值,但是能很直观的看出SQL的优劣了。
filtered
5.1版本之后新增字段,表示针对符合查询条件的记录数的百分比估算,用rows和filtered相乘可以计算出关联表的行数。
Extra
解析查询的附加额外信息,这个太多了,有兴趣可以自己看官方文档,只列举一些常见的。
Using index
使用覆盖索引。
Using index condition
可以使用索引下推(不一定真的使用了),索引下推简单来说就是加上了条件筛选,减少了回表的操作。
Using temporary
排序使用了临时表。
Using filesort
使用外部索引文件排序,但是不能从这里看出是内存还是磁盘排序,我们只能知道更消耗性能。
Using where
where过滤,没啥好说的。
Zero limit
除非你写个LIMIT 0。
Using sort_union(), Using union(), sing intersect()
使用了索引合并,参看上文。
总结
文章转自公众号:艾小仙