昨天讲课时候发现我截图的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)
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就会很大。
这个很大有什么不好,我们下一篇再说。




