273_DBA_执行计划_Key_len_rows_filtered

举报
alexsully 发表于 2022/01/25 00:56:07 2022/01/25
【摘要】 重点是key_len计算 和filtered在join中的意义

Key_len

当我们决定用某个索引来执行查询时, 首先要确定扫描区间,以及形成的扫描区间的边界;MySQL为边界条件中包含的列都维护了一个key_len 该值对应能使用的索引长度是多少

下面这个SQL, 使用到了 idx_key_part索引,但是 key_len 长度是606 意味着 仅能使用到 key_part1 key_part2 形成的区间(边界条件)

explain select * from s2 where key_part1 = "alex"  and key_part2 > "alex" and key_part2 < "sully"  and key_part3 = "sumi" 

Key_len 由下面三部分构成

1 该列的实际数据最多占用的存储空间长度(int类型 4字节, utf8  varchar(100)  3*100= 300字节)

2 如果该列可以存储 null值,则key_len的值在该列实际最多占用存储空间长度基础上 +1 字节

3 对于可变长度类型来说,都会有2字节的空间来存储该变列的实际数据占用的存储空间,key_len 在原先基础上+2字节

Key_part1 : varchar(100) -> 对应的key_len 100*3 + 1 (可以存储null) + 2 (可变类型) = 303

同理key_part2 也为 303; 索引该SQL 只能使用到 key_part1 & key_part2 作为边界

再例

下面SQL 使用主键索引, 边界条件中包含的列 为id int 4字节固定长度) 所以 key_len 4

explain select * from s1  where id = 100;

下面SQL 只能使用 key_part1 充当边界条件(varchar(100) key_len = 100*3 + 1+2 = 303

explain select * from s1  where key_part1 = "alex"  and key_part3 = "sumi "

Ref

当访问方法是const, eq_ref, ref, ref_or_null, unique_subquery, index_subquery时, ref展示的就是与 索隐裂进行等值匹配的东西是啥,可以是一个常数或者是某个列

explain select * from s1  where id = 100;  # const 代表常数匹配

explain select * from s1 join s2 on s1.id = s2.id  # 针对被驱动表s2  ref = s1.id 其实是驱动表的列

Rows

在查询优化器决定使用全表扫描/索引扫描来执行查询时,执行计划的rows 就代表预计扫描的 索引记录

explain select * from s1  where key1  > "alex"  # 全表扫描 预计rows 是9964行

Filtered

根据全表扫描/ 索引条件赛选记录后,满足剩余条件的百分比

单表:使用了全表扫描 9964行,符合 common_field=sumi” 的值 约为 9964 * 5%

explain select * from s1  where key1  > "a" and common_field = "sumi"

Join情况 更为关键,意味着 驱动表的符合条件(select * from s1 where s1.common_field = "sumi")的行数:9964 * 10% = 996次,意味着 被驱动表要扫描 964

explain select * from s1 join s2 on s1.id = s2.id  where  s1.common_field = "sumi"

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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