EXPLAIN 之 key_len 计算

通常在优化SQL查询的时候,我们都会使用EXPLAIN分析SQL执行计划,通常来说当用到联合(组合)索引的时候我们如何判断索引完全用上呢?细心的小伙伴肯定发现EXPLAIN/desc执行计划中有一列 key_len ,它表示在本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了。换句话说,表示索引覆盖长度,用来判断联合索引应用的长度。

如何计算key_len=?

列的key_len长度,按照每列的最大预留长度(最大储值长度)来做的计算。单表越少越好,联合表越多越好。

影响最大存储预留长度(字节)因素:

1.和数据类型有关
在这里插入图片描述

2.是否非空
3.字符集(字符集类型)
在这里插入图片描述
话不多说了,我们直接上例子。表结构如下。_

create table test (
id int  not null primary key auto_increment,
a int not null ,                    #4
b char(10) not null ,               #4*10       40  
c char(5) ,                         #5*4+1      21
d varchar(20) not null ,            #20*4+2     82
e varchar(10)                       #10*4+2+11  43
)engine=innodb charset=utf8mb4;

如果a,b,c,d,e的联合索引,全部覆盖到,key_len是多少

select 4+40+21+82+43;

在这里插入图片描述

如果a,b,c,d的联合索引,全部覆盖到,key_len是多少

select 4+40+21+82;

在这里插入图片描述
如果a,b,c的联合索引,全部覆盖到,key_len是多少

select 4+40+21;

如果a,b的联合索引,全部覆盖到,key_len是多少

select 4+40;

联合索引应用细节
举个栗子:

create table test (
id int not null primary key auto_increment,
a  int not null ,                  # 4
b  int ,                           # 5
c  char(10) not null ,             # 40
d  varchar(10),                    # 43
e  varchar(10) not null            # 42
)engine=innodb charset=utf8mb4;

图片
图一
图片
图二

喔,咋回事捏?
图一:在联合索引应用中,隐式转换导致索引失效
图二:在联合索引应用中,需要满足最左原则
a.建立联合索引时,选择重复值最少的列作为最左列。
b.使用联合索引时,查询条件中,必须包含最左列,才可能应用到联合索引
联合索引不同覆盖场景
举个栗子:

CREATE TABLE `t100w` (
  `id` int(11) DEFAULT NULL,
  `num` int(11) DEFAULT NULL,                # 5
  `k1` char(2) DEFAULT NULL,                 # 9
  `k2` char(4) DEFAULT NULL,                 # 17
  `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

在这里插入图片描述

全覆盖

情景1:走联合索引

desc select * from t100w where num=913759 and k1="ej" and k2="EFfg";

情景2:条件顺序无所谓

desc select * from t100w where k1="ej" and k2="EFfg" and num=913759;

图片

情景3:in查询走联合索引

desc select * from t100w where k1="ej" and k2 in ("EFfg","abc") and num=913759;

情景4:最后一个非等于走联合索引

desc select * from t100w where num=913759 and k1="ej" and k2 like "EF%";

情景5:最后一个非等于走联合索引

desc select * from t100w where num=913759 and k1="ej" and k2 > "EFfg";
ii.部分覆盖

中间非等于不走联合索引

desc select * from t100w where num=913759 and k1 > "zz" and k2 like "EF%";

图片

desc select * from t100w where num=913759 and k1="ej";
desc select * from t100w where num=913759 and  k2 like "EF%";
desc select * from t100w where num=913759 and k1 != "zz" and k2 like "EFfg";

更多精彩内容欢迎关注微信公众号

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值