如下所示,innodb的存储结构包含:表空间,段,区,页(块),行
innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高
表空间:零散页+段
独立表空间存放的是:数据、索引、插入缓冲。
共享表空间存放的是:撤销信息、系统事务信息、二次写缓冲。共享表空间扩展后就不会回缩了。
段:存储引擎自动管理
区:由64个连续的页组成,每个页大小为16K(每个区大小为1M),对于大的数据段,innodb存储引擎每次最多可以申请4个 区,以此来保证数据的顺序性能。在每个段开始都有32个页大小的碎片页用来存放数据,当这些页使用完之后才64个连续页申请
页:innodb磁盘管理的最小单位。
行:innodb存储引擎是面向行的。每个页存放的行也有硬性限制:最多允许存放16K/2-200行(7992行)的记录。
Antelope文件格式
compact行记录格式:
变长字段长度列表:1-2字节,如果变长字段总和小于256个字符占用一个字节,大于255个字节小于65535个字节用2个字节存储,因为2的16次方=65536,所以一个表的变长字段列总和不能超过65535。
NULL标志位:标志该行中哪些列为空,用1表示。
记录头信息:用5个字节表示
列数据:(额外包含,事务id列,回滚指针列,如果没有主键的话还会有个6字节的rowid),如果某列数据为NUll则除了NULL标志位外不占用任何额外的空间。
Rebundant行记录格式:
字段长度偏移列表:1-2字节
记录头信息:6字节
n_fileds表示列的数量,因为只有10位,所以一个Redundant格式的表的列数不能超过1024列
对于varchar类型的null值不占用空间,但是对于char类型的null值需要占用空间
行溢出:
一个页中至少应该有两行记录,如果当前页中只能存放一条记录,那么innodb会自动将行数据存放在溢出页中
Barracuda文件格式
行溢出: