innodb的存储结构

Posted 人生不设限

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了innodb的存储结构相关的知识,希望对你有一定的参考价值。

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

image

innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高
表空间:零散页+段
  独立表空间存放的是:数据、索引、插入缓冲位图页。
  共享表空间存放的是:undo信息、系统事务信息、二次写缓冲、插入缓冲等。共享表空间扩展后就不会回缩了。
段:存储引擎自动管理
区:由64个连续的页组成,每个页大小为16K(每个区大小为1M),对于大的数据段,innodb存储引擎每次最多可以申请4个区,以此来保证数据的顺序性能。在每个段开始都有32个页大小的碎片页用来存放数据,当这些页使用完之后才64个连续页申请
页:innodb磁盘管理的最小单位

imageimage

 

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字节)+各列数据(除了实际列还有两个隐藏列)

image

  变长字段长度列表: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):页中下一条记录的相对位置

imageimage

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

  •   Rebundant行记录格式:字段长度偏移列表(1-2字节)+记录头信息(6字节)+各列数据

image

  字段长度偏移列表: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):页中下一条记录的相对位置

  image

  •   行溢出

  一个页中至少应该有两行记录,如果当前页中只能存放一条记录,那么innodb会自动将行数据存放在真实的数据页之外
  Antelope文件格式的行溢出:

    image

  Barracuda文件格式的行溢出:

      imageimage

小实验:

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

 

 

 

以上是关于innodb的存储结构的主要内容,如果未能解决你的问题,请参考以下文章

《MySQL系列-InnoDB引擎25》表-InnoDB逻辑存储结构

InnoDB逻辑存储结构

Innodb 和 MyIsam 两种存储引擎的文件存储结构

_InnoDB数据存储结构

InnoDB存储引擎介绍-InnoDB存储引擎结构

innodb的存储结构