都说通过 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)
纯粹总结,如果有误,请及时指正。如有雷同,纯属意外