key_len怎么算?

来源:这里教程网 时间:2026-03-01 17:00:35 作者:

      昨天讲课时候发现我截图的 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就会很大。

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

                                   

相关推荐