MySQL有什么页

在MySQL中,特别是对于其最常用的InnoDB存储引擎,“页”(Page)是其管理磁盘存储和内存缓冲的最基本单位。InnoDB将所有数据都存放在一个或多个表空间(tablespace)文件中,而表空间在物理上是由一系列连续的数据页组成的。可以把页理解为InnoDB与磁盘进行I/O交互的最小单元。

默认情况下,InnoDB的页大小是16KB,但也可以在创建MySQL实例时配置为其他值(如4KB, 8KB, 32KB, 64KB)。

InnoDB中有多种不同类型的页,它们各自有不同的结构和用途,共同构成了整个数据库的存储体系。以下是一些主要的页类型:

  1. 数据页(Data Page),也称为索引页(Index Page):

    • 这是最核心、最常见的页类型,用于存储表中的行数据以及B+树索引。
    • 无论是聚簇索引(主键索引)还是二级索引,它们的节点在物理上都是以数据页的形式存在的。
    • 一个数据页的内部结构非常复杂,大致包含:
      • 文件头(File Header):记录页的编号、类型、校验和、前后页指针等元信息。
      • 页头(Page Header):记录页的状态信息,如页内记录数、空闲空间指针、最后插入记录的位置等。
      • Infimum + Supremum 记录:两个虚拟的行记录,分别代表页中的最小值和最大值,用于界定页的范围。
      • 用户记录(User Records):实际存储的数据行,它们在页内通过单向链表连接,并按主键顺序(对于聚簇索引)或索引键顺序(对于二级索引)排列。
      • 空闲空间(Free Space):页中尚未使用的空间。
      • 页目录(Page Directory):也称为槽(Slot),用于加速页内记录的查找。它将页中的记录分成若干个组,存储每个组最后一条记录的地址偏移量,形成一个稀疏索引。查找时先通过二分查找定位到槽,再在槽内进行顺序查找。
      • 文件尾(File Trailer):包含校验和等信息,用于在页写入磁盘后进行一致性校验,防止页损坏。
  2. Undo日志页(Undo Log Page):

    • 用于存储Undo Log记录。Undo Log是实现事务原子性和MVCC(多版本并发控制)的关键。
    • 当事务修改数据时,会将修改前的数据版本或回滚操作记录到Undo Log中。这些Undo Log记录就存放在Undo日志页里。
  3. 系统页(System Page):

    • 用于存储数据库运行所需的各种系统级元数据。例如:
      • InnoDB数据字典头页(Data Dictionary Header Page):包含数据字典的根节点信息、系统表空间头部信息等。
      • 插入缓冲位图页(Insert Buffer Bitmap Page):用于管理Insert Buffer(现在称为Change Buffer)的信息。
  4. 事务系统页(Transaction System Page):

    • 存储与事务系统相关的元数据,例如当前活跃事务的最大事务ID、Undo日志所在的段信息等。
  5. 溢出页(Unallocated Page),更准确的说法是溢出数据存储(Off-page Storage):

    • 当一行数据的大小超过一个数据页所能容纳的限制时(例如,包含了非常大的TEXTBLOBVARCHAR字段),InnoDB不会将整行数据都存储在一个数据页中。
    • 它会将这行数据中一部分较小或定长的列存储在B+树的数据页中,而将那些大的、可变长度的列存储在专门的溢出页(Unallocated Page,实际上是分配一些连续的页来存储)中。B+树的数据页中只保留一个指向这些溢出页的20字节指针。
    • 这种机制称为行溢出(Row Overflow)。
  6. 未分配页(Unallocated Page):

    • 表空间中尚未被任何数据结构使用的空闲页。
  7. 其他专用页:

    • 例如,InnoDB还使用一些专门的页来管理表空间中的区(Extent,由64个连续的页组成)和段(Segment)的分配信息,如INODE页、IBUF_BITMAP页等。

可以把InnoDB的存储看作是一个由各种不同类型的页构成的复杂结构: * 数据页(索引页)是存放用户数据和B+树索引的主体。 * Undo日志页负责事务的回滚和MVCC。 * 系统页和事务系统页等存储着维持数据库正常运行的各种元数据。 * 溢出页用于存储过大的列数据。