常见类型
在InnoDB存储引擎中,常见的页类型包括以下几种
- 数据页(Data Page):存储表中的数据记录。
- 索引页(Index Page):存储表的索引信息。
- undo页(Undo Page):存储事务回滚信息。
- redo页(Redo Page):存储事务提交信息。
- 描述页(FSP Page):存储表空间的元数据信息。
- 描述页(Inode Page):存储InnoDB文件系统的元数据信息。
- BLOB页(BLOB Page):存储BLOB和TEXT类型的数据。
- 描述页(SYS_PAGE):存储系统表空间的元数据信息。
- 描述页(IBUF_BITMAP_PAGE):存储insert buffer的位图信息。
Page页结构
MySQL page页的结构Page页各部分说明
名称 | 占用大小 | 说明 |
File Header | 38字节 | 文件头, 描述页信息 |
Page Header | 56字节 | 页头,页的状态 |
Infimum + Supremum | 26字节 | 最大和最小记录,这是两个虚拟的行记录 |
User Records | 不确定 | 用户记录,存储数据行记录 |
Free Space | 不确定 | 空闲空间,页中还没有被使用的空间 |
Page Directory | 不确定 | 页目录,存储用户记录的相对位置 |
File Trailer | 8字节 | 文件尾,校验页是否完整 |
File Header
用于记录 Page 的头信息,其中通过 FIL_PAGE_PREV
和 FIL_PAGE_NEXT
字段与其它页形成一条双向链表
Page Header
用于记录 Page 的状态信息
Infimum + Supremum
伪行记录
Infimum:下确界
记录该页中比任何主键值都要小的值
Supremum:上确界
记录该页中比任何主键值都要大的值
伪记录分别构成了页中记录的边界
User Records
存放实际的数据行记录,每一个 User Record 通常包含以下信息:
- Record Header:记录头部,包含了一些重要的记录级别元数据信息,例如记录大小、记录类型、记录格式等。
- Record Data:记录数据,即实际存储在表中的数据内容。
当有数据插入的时候,会从 页空闲空间 进行分配用于存储新的记录
Free Space
在InnoDB存储引擎中,Free Space是一种用于管理表空间中未使用空间的数据结构,它的作用是记录表空间中所有未使用的空间块的位置和大小信息。
Free Space通常由多个连续的页组成,每个页被称为Free Space Page(FSP)。每个FSP中包含多个Free Space Entry(FSE),每个FSE记录了一个未使用的空间块的位置和大小信息。
具体来说,每个FSE包含以下信息:
- Start Offset:空间块在表空间文件中的起始位置偏移量。
- Length:空间块的大小。
- Flags:空间块的状态信息,例如是否已分配、是否是最后一个空间块等。
通过Free Space,InnoDB存储引擎可以快速地查找和管理表空间中的未使用空间。例如,当需要分配新的数据页时,InnoDB可以通过Free Space查找到一个足够大的未使用空间块,并将其标记为已分配状态;当需要删除某个数据页时,InnoDB可以将该页所占用的空间块标记为未使用状态,并将其添加到Free Space中,以便后续重复利用。
需要注意的是,Free Space只用于管理表空间中未使用的空间块,而不管理其他类型的页(例如数据页、undo页、redo页等)。此外,在不同版本的InnoDB存储引擎中,Free Space可能会有不同的实现方式和优化策略,例如在MySQL 8.0中,InnoDB存储引擎引入了一种称为"UNIV_PAGE_SIZE"的新特性来改进Free Space的管理方式。
Page Directory
在InnoDB存储引擎中,Page Directory是一种用于管理页的数据结构,它的作用是记录表空间中所有数据页的位置和状态信息。
Page Directory通常由多个连续的页组成,每个页被称为Page Directory Page(PDP)。每个PDP中包含多个Page Directory Entry(PDE),每个PDE记录了一个数据页的位置和状态信息。
具体来说,每个PDE包含以下信息:
- Page Number:数据页的编号。
- File Segment/Page Offset:数据页在表空间文件中的位置偏移量。
- Page Type:数据页的类型,例如数据页、索引页等。
- Page State:数据页的状态,例如已分配、未分配等。
通过Page Directory,InnoDB存储引擎可以快速地查找和管理表空间中的数据页。例如,当需要分配新的数据页时,InnoDB可以通过Page Directory查找到一个未分配的页,并将其标记为已分配状态;当需要读取某个数据页时,InnoDB可以通过Page Directory查找到该页在表空间文件中的位置,并从文件中读取该页的内容。
需要注意的是,Page Directory只用于管理数据页,而不管理其他类型的页(例如undo页、redo页等)。此外,不同版本的InnoDB存储引擎可能会有不同的Page Directory实现方式,例如在MySQL 8.0中,InnoDB存储引擎使用了一种称为"UNIV_PAGE_SIZE"的新特性来改进Page Directory的实现方式。
File Trailer
File Trailer是表空间文件的结尾部分,包含了一些重要的文件级别元数据信息,例如文件大小、页数、校验和等。