innodb的存储结构

时间:2023-03-09 01:49:04
innodb的存储结构

如下所示,innodb的存储结构包含:表空间,段,区,页(块),行

innodb的存储结构

innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高

表空间:零散页+段

独立表空间存放的是:数据、索引、插入缓冲。

共享表空间存放的是:撤销信息、系统事务信息、二次写缓冲。共享表空间扩展后就不会回缩了。

段:存储引擎自动管理

区:由64个连续的页组成,每个页大小为16K(每个区大小为1M),对于大的数据段,innodb存储引擎每次最多可以申请4个  区,以此来保证数据的顺序性能。在每个段开始都有32个页大小的碎片页用来存放数据,当这些页使用完之后才64个连续页申请

页:innodb磁盘管理的最小单位。

innodb的存储结构

innodb的存储结构

行:innodb存储引擎是面向行的。每个页存放的行也有硬性限制:最多允许存放16K/2-200行(7992行)的记录。

Antelope文件格式

compact行记录格式:

innodb的存储结构

变长字段长度列表:1-2字节,如果变长字段总和小于256个字符占用一个字节,大于255个字节小于65535个字节用2个字节存储,因为2的16次方=65536,所以一个表的变长字段列总和不能超过65535。

NULL标志位:标志该行中哪些列为空,用1表示。

记录头信息:用5个字节表示

innodb的存储结构

innodb的存储结构

列数据:(额外包含,事务id列,回滚指针列,如果没有主键的话还会有个6字节的rowid),如果某列数据为NUll则除了NULL标志位外不占用任何额外的空间。

Rebundant行记录格式:

innodb的存储结构

字段长度偏移列表:1-2字节

记录头信息:6字节

innodb的存储结构

n_fileds表示列的数量,因为只有10位,所以一个Redundant格式的表的列数不能超过1024列

对于varchar类型的null值不占用空间,但是对于char类型的null值需要占用空间

行溢出:

一个页中至少应该有两行记录,如果当前页中只能存放一条记录,那么innodb会自动将行数据存放在溢出页中

innodb的存储结构

Barracuda文件格式

行溢出:

innodb的存储结构

innodb的存储结构

小实验:

小编做了个关于innodb表最大支持多少列的实验,发现无论用什么文件格式(DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT)文件的列数都不能超过1017列