跳到主要内容

MySQL 存储引擎

数据页 data page

磁盘与内存交互的基本单位:在数据库中,不论读一行还是多行,都是将这些行所在的页进行加载。

数据页是 MySQL 在磁盘上存储数据的最小单位。默认为 16 KB。每个数据页由页头(page header)和数据区(data area)组成。

页头

位于每个数据页的开头,用于存储关于数据页的元信息。

  • 数据页标识 page id
  • 版本号 page version : 用于并发控制和数据完整性。
  • 空闲空间列表 free space list:用于存储数据页中空闲空间的块地址和大小。
  • 指针 pointers :用于链接不同的数据页,形成数据页链表。
  • 其他元数据信息:如检验和、页类型标识等。

数据区

存储实际的数据记录。

组织数据的方式

  • 堆组织:在堆组织中,数据记录按照插入的顺序存储在数据区中。每条记录都有一个额外的字节标示是否被删除,但不保证记录在磁盘上的存储顺序。
  • 索引组织:在索引组织中,数据记录按照索引的排列顺序存储在数据区中。这样可以加快索引查询的速度,但也增加了记录插入和删除的复杂性。

数据页的分裂和合并

  • 当数据页存储数据过多、空间不足时,MySQL 会对数据页进行分裂操作。
  • 当数据页的数据减少、空闲空间过大时,MySQL 会对数据页进行合并操作。

数据页的管理和优化策略

  • 适当的调整数据页的大小
  • 定期进行索引重建
  • 合理选择存储引擎
  • 适当的配置数据库缓存:通过合理配置数据库缓存,如MySQL的缓冲池(Buffer Pool),可以提高数据页的访问速度和性能。

页的上层结构

在数据库中还存在区(extent)、段(segment)、表空间(tablespace)的概念。

区:比页大一级的存储结构,在 InnoDB 存储引擎中,一个页会分配 64 个连续的页。因此页的默认大小为 1MB

段:由一个或多个区组成,区在文件系统是一个连续分配的空间(在 InnoDB 中是连续的 64 个页)。 段是数据库中分配的单位,不同类型的数据库对象以不用的段形式存在。 创建表时会创建一个表段,创建索引时会创建一个索引段。

表空间:是一个逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段。但是一个段只能属于一个表空间。 表空间可以分为系统表空间用户表空间撤销表空间临时表空间

页的类型

  • 数据页
  • 系统页
  • undo 页
  • 事务数据页

页的内部结构

  • 文件头
  • 页头
  • 最大最小记录
  • 用户记录
  • 空闲空间
  • 页目录
  • 文件尾

文件头和文件尾

InnoDB 行格式(记录格式)

区、段和碎片去

表空间