272_DBA_执行计划_Type_possible_keys_key

举报
alexsully 发表于 2022/01/24 23:25:03 2022/01/24
【摘要】 主要分析 type 种类

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可能为空,但实际用到了索引 ,如下

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。