272_DBA_执行计划_Type_possible_keys_key
Type
执行计划的一条记录代表MySQL对某个表执行查询时访问的方法,type代表访问的具体方法
方法 |
描述 |
System |
表中只有一条记录且使用存储引擎的统计是准确的 |
Const |
根据主键or唯一二级索引与常数进行等值匹配的方法 |
Eq_ref |
连接查询,被驱动表通过主键or唯一二级索引列进行等值访问,则被驱动表访问方法为eq_ref |
Ref |
当通过普通的二级索引与常量进行等值匹配的方式进行查询 方法为ref |
Fulltext |
|
Ref_or_null |
当通过普通的二级索引与常量进行等值匹配 且该索引列也可以为null 的方式进行查询 |
Index_merge |
索引合并 |
Unique_subquery |
类似两表join被驱动表的eq_ref访问方法,该方法针对一些包含IN子查询语句, 如果优化器决定将in转为exists且子查询可以使用主键/唯一键进行等值匹配 |
Index_subquery |
unique_subquery 类似,只不过子查询中使用的是普通二级索引 |
Range |
如果使用索引获取单点扫描区间,就能用range 访问方法 |
Index |
使用索引覆盖,需要扫描全部索引记录的访问方法就是index |
All |
全表扫描 |
1 Const
根据主键or唯一二级索引与常数进行等值匹配的方法
explain select * from t1 where id =1;
2 Eq_ref
连接查询,被驱动表通过主键or唯一二级索引列进行等值访问,则被驱动表访问方法为eq_ref
S1为驱动表,s2为被驱动表
explain select * from s1 join s2 on s1.id = s2.id
3 Ref
当通过普通的二级索引与常量进行等值匹配的方式进行查询 方法为ref
explain select * from s1 join s2 on s1.key1 = s2.key1
4 Ref_or_null
当通过普通的二级索引与常量进行等值匹配 且该索引列也可以为null 的方式进行查询
explain select * from s1 where s1.key1 = "alex" or key1 is null;
5 Index_merge
索引合并
一般情况下, MySQL只会为单表生成扫描空间,在一些特殊情况下,mysql也会为多个索引生成扫描区间, 多个索引完成一次查询称为index_merge
情况1 intersection 索引合并 (交集)
同时使用key1 和 key3 进行查询, 找出结果相同的ID,再根据ID进行回表查询
explain select * from s1 where s1.key1 = "alxxxx" and s1.key3= "bxxxxob";
情况2 union 索引合并(并集)
explain select * from s1 where s1.key1 = "alex" or key3 = "bob";
情况3 sort-union 索引合并
条件较为严苛,必须保证各个索引扫描到的记录的主键是有序的;
将key1 < a 获取对应的主键 进行排序; 将key3 > z 获取对应的主键 进行排序
再将两个排好序的结果集 进行union索引合并 (比单纯的 union多了排序的过程)
explain select * from s1 where s1.key1 < "a" or s1.key3 > "z";
6 Unique_subquery
类似两表join被驱动表的eq_ref访问方法,该方法针对一些包含IN子查询语句, 如果优化器决定将in转为exists且子查询可以使用主键/唯一键进行等值匹配,该执行计划为 unique_subquery
explain select * from s1 where common_field in (select id from s2 where s1.common_field = s2.common_field) or s1.key3 = "a"
7 Index_subquery
与unique_subquery 类似,只不过子查询中使用的是普通二级索引
explain select * from s1 where common_field in (select key3 from s2 where s1.common_field = s2.common_field) or s1.key3 = "a"
8 Range
如果使用索引获取单点扫描区间,就能用range 访问方法
explain select * from s1 where key1 in ("a","b","c")
9 Index
使用索引覆盖,需要扫描全部索引记录的访问方法就是index
查询中包括 key_part1 key_part2 ,条件中只有 key_part3, 但单一key_part3 并不能减少扫描记录数量,只能扫描整个idx_key_part 访问计划为 index
explain select key_part1,key_part2 from s1 where key_part3 = "bbob"
Possible_keys & key
执行单表查询时候 possible_keys 为可能用到哪些key, key为实际用到了 哪些key
注意
possible_keys不是越多越好,可能用到索引多 说明优化器计算成本的时间就越长,尽量联合索引覆盖单索引
有时候 使用index 访问时 possible_key可能为空,但实际用到了索引 ,如下
- 点赞
- 收藏
- 关注作者
评论(0)