暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

key_len怎么算?

原创 薛晓刚 2023-01-09
590

      昨天讲课时候发现我截图的key_len和我算的不一样。按理说这种讲了很多次了,实验也做了很多次,没可能错。后来课后检查,发现是字符集略有差别。今天借这个说一下,截图的字符集和我昨天实操的有点差别。一个是utf-8,还有一个是utf-8mb4。我们先看实验吧。看图1. 


                                                                                                             图1

mysql> create table xxg.xuexiaogang (id int ,a int ,b varchar(1),c varchar(1) not null, d char(1),e char(1) not null);

Query OK, 0 rows affected (0.03 sec)


 然后写入5条数据。


mysql> insert into xxg.xuexiaogang values (1,1,'1','1','1','1');

Query OK, 1 row affected (0.01 sec)

 

mysql> insert into xxg.xuexiaogang values (2,2,'2','2','2','2');

Query OK, 1 row affected (0.01 sec)

 

mysql> insert into xxg.xuexiaogang values (3,3,'3','3','3','3');

Query OK, 1 row affected (0.01 sec)

 

mysql> insert into xxg.xuexiaogang values (4,4,'4','4','4','4');

Query OK, 1 row affected (0.01 sec)

 

mysql> insert into xxg.xuexiaogang values (5,5,'5','5','5','5');

Query OK, 1 row affected (0.01 sec)


然后为每一列创建索引。如图2


                                                                                                图2

mysql> use xxg;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> create index t1 on xxg.xuexiaogang (id);

Query OK, 0 rows affected (0.09 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> create index t2 on xxg.xuexiaogang (a);

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> create index t3 on xxg.xuexiaogang (b);

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> create index t4 on xxg.xuexiaogang (c);

Query OK, 0 rows affected (0.02 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> create index t5 on xxg.xuexiaogang (d);

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> create index t6 on xxg.xuexiaogang (e);

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0


然后看4个执行计划,如图3 分别是红黄蓝绿  

红色可变字符1可以空   key_len=7   

黄色可变字符1不可以空 key_len=6

蓝色不可变字符1可以空 key_len=5

绿色不可变字符1不可以空 key_len=4


                                                                                                                 图3

  这些数值怎么来的?一个字符占3个字节(原来utf8时候,现在是utf8mb4  既然是mb4就是4个字节。我上课时候图对不上就是这个没对上),MySQL规定如果是可变的那么再加两个字节长度来存放,如果是可以为空,再增加一个。              

 b列可变可空=  1X4+2+1 =7

c列可变非空=      1X4+2 =6       

d列不可变可空  =    1X4 +1=5

e 列不可变不可空 =1X4 =4      

所以我们定义数据结构的时候一定要适度,不要上来就是varchar(255),那么这个key_len就会很大。

这个很大有什么不好,我们下一篇再说。

                                   

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论