mysql——页的内部结构

107 阅读2分钟

页如果按照类型划分的话,常见的有 数据页,系统页、Undo日志页和事务数据页等。数据页是我们最常使用的页。

数据页的16KB大小的存储空间被划分为七个部分,分别是文件头(File Header)、页头(Page Header)、最大最小记录(Infimum+supremum)、用户记录(User Records)、空闲空间(Free Space)、页目录(Page Directory)和文件尾(File Tailer)。

页结构的大致示意图如下所示:

在这里插入图片描述

七个部分大致功能说明如下:

  • File Header 文件头:记录各种页的通用信息,比如上下页的页号,页类型,所有的数据页其实是一个双链表
  • Page Header 页头:记录本页存储记录的状态信息,比如本页记录数量,槽数量
  • Infimum + supremum 最小与最大记录,是两个虚拟的行记录
  • User Records 用户记录:真正存数据的地方:以链表的形式存储一条条行记录
  • Free Space 存数据空间中尚未使用的区域
  • Page Directory 页目录:页中某些记录的相对位置,用于提升查询效率
  • File Trailer 文件尾:刷盘时校验页是否完整

File Header 文件头和 File Trailer 文件尾

File Header 文件头

File Header 文件头构成:

名称大小描述
FIL_PAGE_SPACE_OR_CHKSUM4字节页的校验和(checksum),文件尾也有这个属性,用于自校验。为了快速比较、保证数据的完整性防止遭到破坏等,采用给这页加上校验和到页尾的时候做自校验。
FIL_PAGE_OFFSET4字节页号,每一个页都都有一个单独的页号,InnoDB通过页号可以定位到这个页
FIL_PAGE_PREV4字节上一个页的页号
FIL_PAGE_NEXT4字节下一个页的页号,保证了页之间是逻辑上的连续
FIL_PAGE_LSN8字节页面最后被修改的日志序列位置
FIL_PAGE_TYPE2字节该页的类型
FIL_PAGE_FILE_FLUSH_LSN8字节独立表空间中都是0
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4字节页属于哪个表空间

File Trailer 文件尾

File Trailer 文件尾(8个字节)构成:

  • 前4个字节代表页的校验和,这个部分和 File Header 中的校验和相对应
  • 后4个字节代表页面被最后修改时对应的日志序列位置(LSN),这个部分也是为了校验页的完整性的,如果首部和尾部的LSN值校验不成功的话,就说明同步传输过程出现了问题。