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 页
- 事务数据页
页的内部结构
- 文件头
- 页头
- 最大最小记录
- 用户记录
- 空闲空间
- 页目录
- 文件尾