MYSQL性能分析之explain 之type字段案例分析
type列总结
依次性能从好到差:system << const << eq_ref << ref << fulltext/ref_or_null/unique_subquery/index_subquery << range << index_merge << index << all,
除了all之年,其他的type都可以使用到索引,除了index_merge之年,其他的type只可以用于一个索引。一般来说,好的sql查询至少达到range级别,最好能达到ref
1. system
表中只有一行数据或者空表,且只能用于myisam和memory表,如果是Innodb引擎表,type列在这个情况通常都是all和index
2. const
使用唯一索引或主键,返回记录一定是1行记录的等值where条件时,通常type是const,其他数据库也叫做唯一索引扫描
3. eq_ref
出现在多表查询计划中,驱动表循环获取数据,这行数据是第二个表的主键或者唯一索引,任务条件查询只返回一条数据,且必须为not null, 唯一索引和主键是多列时,只有所有的列都用途比较时才会出现eq_ref
4. ref
不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可以出现,常见与辅助索引的等值查询或多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查询就可以出现
5. ref_or_null
与ref方法类似,只是增加了null值的比较,实际用得不多
6. fulltext
全文索引检索,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管条件,优先选择使用全方索引
创建:create fulltext index ft_index_func_clsName_clsDesc on func(cls_name, cls_desc) with parser ngram;
查看匹配字段的长度:show variables like ngram_token_size [配置文件中设置]
7. unique_subquery
用于where中的in形式子查询,子查询返回不重复值唯一值[少见场景]
8. index_subquery
用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重[少见场景]
9. range
索引范围扫描,常用于使用>,<, is null,between, in, like等运算符的查询中
10. index_merge
表示查询使用了两个以上的索引,最后取交集或者并集,常见and, or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取多个索引,性能可能大部分时间都不如range
10. index
索引全盘扫描,把索引从头到尾找一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询
11. all
全表扫描数据文件