mysql 每日一问之行溢出
mysql 行存储形式
- Compact:Compact是一种紧凑的行格式,设计的初衷就是为了让一个数据页中可以存放更多的数据行
- Redundant
- Dynamic
- Compress
MySQL单行能存储多大体量的数据?
在MySQL的设定中,单行数据最大能存储65535byte的数据(注意是byte,而不是字符)!!
mysql> create table t_cat ( name varchar(65535)) engine=innodb charset=utf8mb4;
ERROR 1074 (42000): Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
mysql> select 65536/4;
+------------+
| 65536/4 |
+------------+
| 16384.0000 |
+------------+
1 row in set (0.00 sec)
在 utf8mb4 字符集下,一个汉字占4个字节 65536/4=16383 个汉字
什么是行溢出?
如果数据页默认大小为16KB,换算成byte:16*1024 = 16384 byte
也就是说:
-
假如你要存储的数据行很大超过了65532byte那么你是写入不进去的
-
假如你要存储的单行数据小于65535byte但是大于16384byte,这时你可以成功insert,但是一个数据页又存储不了你插入的数据。这时肯定会行溢出
行溢出处理
在MySQL设定中,当varchar列长度达到768byte后,会将该列的前768byte当作prefix存放在行中,多出来的数据溢出存放到溢出页中,然后通过一个偏移量指针将两者关联起来,这就是行溢出机制