273_DBA_执行计划_Key_len_rows_filtered
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"
- 点赞
- 收藏
- 关注作者
评论(0)