MySQL数据库—InnoDB数据页结构

目录

      • 一、页
      • 二、数据页结构图
      • 三、File Header
      • 四、Page Header
      • 五、Infimun和Supremum Record
      • 六、User Record和Free Space
      • 七、Page Directory
      • 八、File Trailer

一、页

页是InnoDB磁盘管理的最小单位,默认每页为16KB,从InnoDB1.2.x开始,可以通过innodb_page_size参数将页设置为4K、8K、16K。常见的页有数据页(B-tree Node)、undo页(undo Log Page)、插入缓冲位图页(Insert Buffer Bitmap)等。下文主要分析数据页。

二、数据页结构图

MySQL数据库—InnoDB数据页结构_第1张图片

三、File Header

FileHeader部分固定占有48个字节,其每个字节代表意义如下:

MySQL数据库—InnoDB数据页结构_第2张图片

其中,

  • FIL_PAGE_SPACE_OR_CHKSUM:checksum值是用了做本页数据的校验的,在mysql5.6后,默认的校验算法为crc32,也即32位循环冗余校验。

  • FIL_PAGE_PREV和FIL_PAGE_NEXT:这两项可以看出,逻辑上相邻的两页是由双向链表的形式连接的。

  • FIL_PAGE_TYPE:表示页类型,存储真实数据的页即为数据页,也即图中的B+树页节点的0x45BF,其他常见页类型如下图:

MySQL数据库—InnoDB数据页结构_第3张图片

四、Page Header

Page Header部分固定占有56个字节,各个字节代表的内容如下:

MySQL数据库—InnoDB数据页结构_第4张图片
其中,

  • PAGE_N_DIR_SLOTS:槽的概念在下文有介绍
  • PAGE_HEAP_TOP:表示Free Space开始位置相对页起始位置的偏移量
  • PAGE_N_HEAP:带符号的记录数(包括两条虚记录),在Compact行记录格式下,初始值为0x0802
  • PAGE_N_RECS:记录数,不包括两条虚记录
  • PAGE_DIRECTION:插入记录的方向,如果主键为自增的,则为向右插入

五、Infimun和Supremum Record

这两个字段是每个数据页中都会自动创建的虚拟行记录,这两个记录在页创建时被建立,并且任何时候都不会被删除。

Infimum Record为最大下界记录,被认为是在该表中最小的记录。这条记录只有一个char(8)列,且值为字符串"Infimum",其行记录格式仅为 record header(5字节)+列数据(8字节)

Supremun Record为最小上界记录,被认为是在该表中最大的记录。这条记录页只有一个char(8)列,且值为字符串"supremun",其行记录格式仅为 record header(5字节)+列数据(8字节)

如图例子:

MySQL数据库—InnoDB数据页结构_第5张图片

因为表中的行记录是按RowId顺序存储的,所以有了这最小最大的概念,两条虚拟记录为该页中的上下界。

六、User Record和Free Space

User Record即存储真实的行记录,MySQL数据库—InnoDB行存储格式中已经介绍。

Free Space即空间的存储空间,同样也是个链表数据结构。

七、Page Directory

Page Directory 即页目录,相当于对User Record的真实行记录创建的一个稀疏目录。当User Record中的记录比较多时,查询数据将会耗时增多(尤其是在行记录之间是以链表的形式来存储的)。因此,有了Page Dircetory,我们把User Record分为n个段,并将每一段的第一个行记录的RowID的第一个字节的**相对地址(相对于页的起始地址)**用2个字节存放在Page Directory中,称这个相对地址(指针)为槽(Slots),那么分为n个段,则Page Directory中将存放n个槽。如此,可以先在Page Directory中用二分法缩小查询范围,再在User Record中顺序查找相应记录,缩短了查询时间。

MySQL数据库—InnoDB数据页结构_第6张图片

我们将User Record中分的每段的记录数称为相应槽的记录数,而这个数字也就对应了行格式中的Record Header中的4字节的n_owned段。对于n_owned的规定:

  • 虚记录Infimum的n_owned值固定为1
  • 虚记录Supremum的n_owned值可取[1,8]
  • 槽指向的普通记录的n_owned可取[4,8]
  • 不是槽的普通记录的n_owned为0

八、File Trailer

每页最后8字节为File Trailer部分,这部分是为了保证页的完整性

前四个字节为checksum校验和,需要通过crc32(默认)算法与File Header中的FIL_PAGE_SPACE_OR_CHKSUM比较。

后四个字节要与File Header中的FIL_PAGE_LSN值比较。

你可能感兴趣的:(MySQL)