mysql key len 如何计算

都说通过 EXPLAIN 可以看mysql的执行计划,但是里面的字段表示啥意思,你又正的懂嘛?哈哈,工作之余,扯扯蛋。

首先我们创建两张表:

demo_name_1,创表如下图,注意图中的字段类型,长度,还有是否为null 这几个指标。

 

两张表我们都建立联合索引如图:


建表完成。

现在就来执行sql

EXPLAIN SELECT * from `dts_shop`.`demo_name_1` WHERE NAME = 'xxx' ;
EXPLAIN SELECT * from `dts_shop`.`demo_name_2` WHERE NAME = 'xxx' ;

对应的结果如下:

问题1:很奇怪为什么 demo_name_1 的key_len 比 demo_name_2 表中的key_len 长度多1。

原因很简单:

1.所有的索引字段,如果没有设置not null,则需要加一个字节。

可以看看 demo_name_1  和demo_name_2 表在创建的时候name 字段一个是允许为null,另外一个是不允许为null。这大概就是别人一直说建表的时候索引字段一定不能为null,除了会导致索引失效以为还会导致key_len长度增加。作为一名合格的程序员是不允许浪费一点空间的。

问题2:为什么demo_name_2的长度是98呢?如何计算的呢

2.不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。

定长字段,int占四个字节、date占三个字节、char(n)占n个字符。

对于变成字段varchar(n),则有n个字符+两个字节。

几个不成文的小公式可以稍微看看。

varchar(n)类型索引字段,key_len=n(字符)*3+2(字节);

char(n)类型索引字段,key_len=n(字符)*3;

可以往上翻一下,name的长度是32,那么key_len = 32 * 3 + 2 = 98

 

知道了这个我们可以来计算一下这个索引的长度

name类型是varchar长度是32

age的类型是int 长度是 3

like的类型是varchar 长度是255

那么key_len 的长度就是 32*3+2 +4+255 * 3 + 2 = 869,如果字段允许为null 那就在加 3 (因为是3个字段都允许为null,一个字段+1)

 


纯粹总结,如果有误,请及时指正。如有雷同,纯属意外

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值