页如果按照类型划分的话,常见的有 数据页,系统页、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_CHKSUM | 4字节 | 页的校验和(checksum),文件尾也有这个属性,用于自校验。为了快速比较、保证数据的完整性防止遭到破坏等,采用给这页加上校验和到页尾的时候做自校验。 |
| FIL_PAGE_OFFSET | 4字节 | 页号,每一个页都都有一个单独的页号,InnoDB通过页号可以定位到这个页 |
| FIL_PAGE_PREV | 4字节 | 上一个页的页号 |
| FIL_PAGE_NEXT | 4字节 | 下一个页的页号,保证了页之间是逻辑上的连续 |
| FIL_PAGE_LSN | 8字节 | 页面最后被修改的日志序列位置 |
| FIL_PAGE_TYPE | 2字节 | 该页的类型 |
| FIL_PAGE_FILE_FLUSH_LSN | 8字节 | 独立表空间中都是0 |
| FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID | 4字节 | 页属于哪个表空间 |
File Trailer 文件尾
File Trailer 文件尾(8个字节)构成:
- 前4个字节代表页的校验和,这个部分和 File Header 中的校验和相对应
- 后4个字节代表页面被最后修改时对应的日志序列位置(LSN),这个部分也是为了校验页的完整性的,如果首部和尾部的LSN值校验不成功的话,就说明同步传输过程出现了问题。