什么是MySQL的执行计划(Explain关键字)?( 二 )
2)const和system:const出现在用 primary key(主键) 或 unique key(唯一键) 的所有列与常数比较时 , 优化器对查询进行优化并将其部分查询转化成一个常量 。 最多有一个匹配行 , 读取1次 , 速度非常快 。 而system是const的特例 , 表中数据只有一条匹配时为system 。 此时可以用explain extended+show warnings查看执行结果 。
explain extended select * from (select * from t_user where user_id = 1) tmp;
show warnings;
文章插图
文章插图
MySQL5.7及以后版本优化后:
文章插图
文章插图
3)eq_ref:primary key(主键)或 unique key(唯一键) 索引的所有构成部分被join使用, 只会返回一条符合条件的数据行 。 这是仅次于const的连接类型 。
explain select * from t_group_user gu left join t_group g ong.group_id = gu.group_id;
文章插图
4) ref:与eq_ref相比 , ref类型不是使用primary key(主键) 或 unique key(唯一键)等唯一索引 , 而是使用普通索引或者联合唯一性索引的部分前缀 , 索引和某个值相比较 , 可能会找到符合条件的多个数据行 。
1. 如下示例 , 使用的group_name是普通索引
explain select * from t_group where group_name= 'group1';
文章插图
2.关联表查询
explain select g.group_id from t_group gleft join t_group_user gu on gu.group_id = g.group_id;
文章插图
5)range:出现在 in(),between ,> ,<, >= 等操作符中 。 使用一个索引来查询给定范围的行 。
6)index:扫描全表索引(index是从索引中读取的,所有字段都有索引 , 而all是从硬盘中读取) , 比ALL要快 。
explain select * from t_group;
文章插图
7)all:即全表扫描 , 需要从头到尾去查找所需要的行 。 一般这种情况下这需要增加索引来进行查询优化了
explain select * from t_user;
文章插图
【possible_keys列】这一列的结果表明查询可能使用到哪些索引 。 但有些时候也会出现出现possible_keys 列有结果 , 而 后面的key列显示 null 的情况 , 这是因为此时表中数据不多 , 优化器认为查询索引对查询帮助不大 , 所以没有走索引查询而是进行了全表扫描 。
如果possible_keys列的结果是null , 则表明没有相关的索引 。 这时 , 可以通过优化where子句 , 增加恰当的索引来提升查询性能 。
【key列】这一列表明优化器实际采用哪个索引来优化对该表的访问 。 如果没有使用索引 , 则该列是 null 。
【key_len列】这一列表明了在索引里使用的字节数 , 通过这个值可以大致估算出具体使用了联合索引中的前几个列 。
key_len计算规则这里不再赘述 , 不同的数据类型所占的字节数是不一致的 。
【ref列】这一列表明了在key列记录的索引中 , 表查找值所用到的列或常量 , 常见的有:const(常量) , 字段名 , 如user.user_id
【rows列】这一列表明优化器大概要读取并检测的行数 。 跟实际的数据行数大部分情况是不一致的 。
【Extra列】顾名思义 , 这一列表明的是额外信息,这一列的取值对优化SQL非常有参考意义 。 常见的重要取值如下:
1)using index:所有被查询的字段都是索引列(称为覆盖索引),并且where条件是索引的前导列 , 出现这样的结果 , 是性能高的表现 。
explainselect group_id,group_name from t_group;
文章插图
2)using where:被查询的列未被索引覆盖 , where条件也并非索引的前导列 , 表示 MySQL 执行器从存储引擎接收到查询数据,再进行“后过滤”(Post-filter) 。 所谓“后过滤” , 就是先读取整行数据 , 再检查此行是否符合 where 句的条件 , 符合就留下 , 不符合便丢弃 。
explain select * from t_user whereuser_name='user1';
文章插图
3)using where Using index:被查询的列被索引覆盖 , 并且where条件是索引列之一但是不是索引的前导列 , 也就是没有办法直接通过索引来查询到符合条件的数据
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 麒麟|荣耀新款,麒麟810+4800万超清像素,你还在犹豫什么呢?
- 对手|一加9Pro全面曝光,或是小米11最大对手
- 行业|现在行业内客服托管费用是怎么算的
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 技术|做“视频”绿厂是专业的,这项技术获人民日报评论点赞
- 互联网|苏宁跳出“零售商”重组互联网平台业务 融资60亿只是第一步
- 体验|闭上眼睛点外卖是什么感觉?时隔一年再次体验,进步令人欣慰
- 再次|华为Mate40Pro干瞪眼?P50再次曝光,这次是真香!
