注意:这里只讨论InnoDB引擎。
1. 分类
按时间分为:
- 旧格式:Redundant
- 新格式:Compact
按文件类型分:
- 旧文件格式:Antelope
a. Redundant;
b. Compact; - 新文件格式:Barracuda
a. Compressed;
b. Dynamic;
2. Compact
变长字段长度列表
一个列表:记录非null变长字段长度。列表的顺序是跟列的顺序相反。
比如:a(32),b(64),c(16),d(128) 4个varchar字段存储顺序为d,c,b,a。
因为varchar类型的最大长度限制为65535,所以记录长度:
- 若列的长度小于255字节,用1字节表示;
- 若大于255字节,用2字节表示。
NULL标志位
- 和列相反的顺序。
- 不管是char类型还是varchar类型,在Compact格式下null值都不占用任何存储空间。
举例:
- a,b,c,d,e,f,g,h 共8个列,其中f,g 为null,
- 那么存储的值即为 0000,0110,即 06。
记录头信息
固定占用5字节(40位)。
列数据
- 隐藏列:
事务ID列
、回滚指针列
、rowid列(没有定义主键时才有)
。 - NULL不占此部分任何空间,只占用上面的NULL标志位。
- 固定长度
char类型
字段如果没用完,会用0x20填充。
3. 行溢出数据
- varchar(N)中的N指的是:字符长度。文档中说的单位是字节。
- 一行中
所有列
的长度总和
不能超过65535
。 - 保证
每页
至少存2行
(否则失去了B+Tree的意义,变成链表了)。 - 每页16KB=16384字节,如溢出,数据存 Uncompress BLOB页。
- 如果varchar长度等于8098,存2行,就不会溢出到BLOB页。