innodb的存储结构
Posted 人生不设限
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了innodb的存储结构相关的知识,希望对你有一定的参考价值。
如下所示,innodb的存储结构包含:表空间,段,区,页(块)
innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高
表空间:零散页+段
独立表空间存放的是:数据、索引、插入缓冲位图页。
共享表空间存放的是:undo信息、系统事务信息、二次写缓冲、插入缓冲等。共享表空间扩展后就不会回缩了。
段:存储引擎自动管理
区:由64个连续的页组成,每个页大小为16K(每个区大小为1M),对于大的数据段,innodb存储引擎每次最多可以申请4个区,以此来保证数据的顺序性能。在每个段开始都有32个页大小的碎片页用来存放数据,当这些页使用完之后才64个连续页申请
页:innodb磁盘管理的最小单位
page 结构:File Header(38字节),Page Header(56字节),Infimun和Supremum Records,User Records,Free Space,Page Directory,File Trailer(8字节)
File header:文件头里面包含了该页所在表空间信息,该页在表空间内的偏移量,该页的checksum值,该页的LSN值,该页的类型,该页的上一页指针,该页的下一页指针,页号
page header(位置信息、统计信息,状态信息):在页目录中的槽数、第一个记录的指针、指向可重用空间的首指针、当前页在索引树中的位置、索引ID、记录数、已删除记录的字节数、该页中记录的数量(包括最大最小记录)、最后插入记录的位置、最后插入记录的方向、一个方向连续插入记录的数量、修改当前页的最大事务、PAGE_BTR_SEG_LEAF、PAGE_BTR_SEG_TOP
infimum和supremum record:每个数据页中都有两个虚拟的行,用来限定记录的边界
user record:实际存储行记录内容
free space:空闲空间,同样是个链表结构。在一条记录被删除后,该空间会被加入到空闲链表中
page directory:存放了记录的相对位置,这些记录的指针称为槽
File Trailer:前面四个字节代表该页的checksum值,最后四个字节与FIle header中的FIL_PAGE_LSN相同,通过比较这两个值来保证页的完整性
记录行:innodb存储引擎是面向行的。每个页存放的行也有硬性限制:最少2行,最多允许存放16K/2-200行(7992行)的记录
Antelope文件格式
- compact行记录格式:变长字段长度列表(1-2字节)+NULL标志位(1字节)+记录头信息(5字节)+各列数据(除了实际列还有两个隐藏列)
变长字段长度列表:1-2字节,如果变长字段总和小于256个字符占用一个字节,大于255个字节小于65535个字节用2个字节存储,因为2的16次方=65536,所以一个表的变长字段列总和不能超过65535。
NULL标志位:标志该行中哪些列为空,用1表示。
记录头信息:用5个字节表示,记录头中的内容如下:
delete_flag(1 bit):该行是否被删除
min_rec_flag(1 bit):如果该记录是预先被定义为最小的记录
n_owned(4 bit):当前槽位所管理的记录数,对于最小记录所在的分组只能有 1 条记录,最大记录所在的分组拥有的记录条数只能在 1~8 条之间,剩下的分组中记录的条数范围只能在是 4~8 条之间
heap_no(13 bit):当前记录在本页中的位置
record_type(3 bit):记录类型,000普通,001表示B+树节点指针,010表示Infimum,011表示Supremum,1xx表示保留
next_record(16 bit):页中下一条记录的相对位置
列数据:(额外包含,事务id列,回滚指针列,如果没有主键的话还会有个6字节的rowid),如果某列数据为NUll则除了NULL标志位外不占用任何额外的空间。
- Rebundant行记录格式:字段长度偏移列表(1-2字节)+记录头信息(6字节)+各列数据
字段长度偏移列表:1-2字节
记录头信息:6字节,记录头中的内容如下:
delete_flag(1 bit):该行是否被删除
min_rec_flag(1 bit):如果该记录是预先被定义为最小的记录,
n_owned(4 bit):当前槽位所管理的记录数
heap_no(13 bit):当前记录在本页中的位置
n_fields(10 bit):记录中列的数量,所以mysql中单表列的数目最多为210-1=1024-1=1023列
1byte_offs_flag(1 bit):偏移列表为1字节还是2字节
next_record(16 bit):页中下一条记录的相对位置
- 行溢出
一个页中至少应该有两行记录,如果当前页中只能存放一条记录,那么innodb会自动将行数据存放在真实的数据页之外
Antelope文件格式的行溢出:
Barracuda文件格式的行溢出:
小实验:
做了个关于innodb表最大支持多少列的实验,发现无论用什么文件格式(DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT)文件的列数都不能超过1017列
以上是关于innodb的存储结构的主要内容,如果未能解决你的问题,请参考以下文章