您的位置 首页 数据库

索引覆盖长度

索引覆盖长度

在执行计划列中,key_len主要用来判断联合索引覆盖长度(字节),当覆盖长度越长,就表示匹配度更高,回表查询的次数越少;

到底联合索引被覆盖了多少,就可以通过key_len计算出来;

 

# 联合索引设置
alter table t1 add index id_a_b_c(a列,b列,c列);
# 联合索引应用
select * from t1 where a=xx and b=xx and c=xx
100行 -- 回表100
50行  -- 回表50
10行  -- 回表10

如果全部覆盖到了:长度=a+b+c 即三个列最大预留长度的总和

最大预留长度影响因素?

  • 数据类型:
  • 字符集(GBK:中文每个字符占用2个字节,英文1个字节 /UTF-8:中文每个字符占用3个字节,英文1个字节)
  • not null 是否可以为空 name

最大预留长度计算结果:

实例操作练习:理解key_len索引覆盖长度

创建一个测试数据表:

# 常见测试数据表
use test;
create table keylen (
    id int not null primary key auto_increment,
    k1 int not null,
    k2 char(20),
    k3 varchar(30) not null,
    k4 varchar(10)
) charset=utf8mb4;
​
# 设置表中列索引信息
alter table keylen add index idx(k1,k2,k3,k4);

进行表结构信息与索引设置信息查询:

当四个索引信息全部覆盖,key_len数值计算结果:


# key_len计算思路
k1 = 4
k2 = 4 * 20 +1 = 81
k3 = 4 * 30 +2 = 122
k4 = 4 * 10 +2 + 1 = 43
sum = 4 + 81 + 122 + 43 = 250
​
# 进行校验结果
desc select * from keylen where k1=1 and k2='a' and k3='a' and k4='a';

说明:根据key_len长度数值,理想上是和联合索引的最大预留长度越匹配越好,表示索引都用上了,回表次数自然会少;

 

 

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章