Mysql的存储:页
在数据库系统中,**页(Page) 是数据存储和管理的物理基础单元,其核心概念围绕高效存储、检索与内存交互设计。这个页**和我们java开发中设计到的分页的页不是一个东西,java开发中的分页,指的是开发者指定条数返回的数据集合。
⚙️ 一、页的定义与作用
- 基本单位:
- 页是 磁盘存储和内存交互的 最小单元。数据库读写数据时,以固定大小的页为单位进行磁盘I/O操作,而非单条记录。
- 默认大小:常见规格:4KB、8KB和16KB。(如MySQL InnoDB默认为16KB)
- 设计的目的:
- 减少磁盘I/O次数: 磁盘的速度和内存比起来是差着量级的,一次性读取整个页的数据而不是单行的数据,避免了频繁的I/O操作带来的性能损耗。
- 磁盘I/O的时间主要分为;
- 寻道时间(Seek Time):磁头移动到数据所在磁道的物理耗时(约3-10ms)
- 旋转时间(Rotation Latency):磁头通过磁盘旋转至目标扇区的时间。(7200RPM需要消耗0-4ms)
- 数据传输时间(Transfer Time):实际的独写耗时(约0.1ms)
- 我们就可以发现如果单行(1KB)传输,一次传输的耗时,99%都在寻道和旋转上面,传输仅占1%。
- 整页独写,一次寻道传输16KB,单行的传输时间可以降至 0.5ms,性能大幅提升
- 磁盘I/O的时间主要分为;
- 优化内存管理:通过缓冲池(Buffer Pool)将热点数据页缓存到内存,加速访问。
- 减少磁盘I/O次数: 磁盘的速度和内存比起来是差着量级的,一次性读取整个页的数据而不是单行的数据,避免了频繁的I/O操作带来的性能损耗。
- 存在的问题:内存被很多不必要的数据所占据,内存空间被浪费。系统一次读取16KB的数据,必然有很多数据其实是不必要的。
- 解决的方法:LRU策略。通过缓存池进行类LRU算法的方案进行数据页淘汰,释放空间。
🧱 二、页的内部结构
页由多个功能区组成,典型的结构包括:
- 页头:(page header):存储 元数据,例如:页号、上一页/下一页的指针、页类型(数据页/索引页)、事务ID等控制信息。
- 用户记录(customer records): 存储实际的数据行,每行内容包含数据内容及系统隐藏列(如 事务ID).
- 页目录:槽(slot)结构,用于存储业内数据行的位置索引,支持二分查找快速定位记录。
- 空闲空间:未使用的区域,用于插入数据或者更新现有数据。
- 页尾:检验信息,例如校验和,用来确保数据的写入完整性.
🔗 三、页与存储层级的关系
数据库存储结构分层管理:
- 行(Row)→ 页(Page)→ 区(Extent)→ 段(Segment)
- 区:连续的页组成(例如:如InnoDB中1个区=64页=1MB),是空间分配的基本单位。是为了减少碎片化。
- 段:代表数据库对象(例如:表,索引等),是由一个或者多个区组成,随数据长度的增长动态扩展。
- 逻辑关系:页通过双向链表连接(文件头部的
FIL_PAGE_PREV/FIL_PAGE_NEXT字段),支持跨页记录遍历 - 常见页类型:
| 类型 | 用途 |
|---|---|
| 数据页 | 存储表记录 |
| 索引页 | 存储B+树索引信息 |
| Undo页 | 保存事务回滚日志 |
| 系统页 | 管理表空间元数据 |
| BLOB页 | 存储大对象数据 |
961

被折叠的 条评论
为什么被折叠?



