1. 关系数据库物理存储的本质逻辑
当我们谈论关系数据库的物理数据模型时,实际上是在讨论"表数据如何在磁盘上安家落户"的工程实现。与逻辑模型中的二维表概念不同,物理层面需要解决三个核心矛盾:海量数据的高效存取、快速定位特定数据、以及保证ACID特性下的稳定读写。
现代关系型数据库通常采用"行存储"作为基础架构(如MySQL的InnoDB、PostgreSQL的Heap表),其物理结构可以类比为图书馆的书架系统:
- 每个表对应一个独立的"书库"(表空间文件)
- 每行数据就是一本"书"(记录)
- 书的摆放方式决定了检索效率(存储结构)
- 图书索引卡就是数据库索引(加速定位)
关键认知:物理存储设计就是在空间利用率与查询效率之间寻找最佳平衡点。就像图书馆需要在有限空间里既存放更多书籍,又要让读者快速找到目标。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 存储引擎的底层架构剖析
2.1 页式存储:数据库的原子单位
所有主流关系数据库都采用固定大小的"页"(Page)作为磁盘I/O最小单元,典型配置为4KB-64KB。这相当于图书馆规定每个书架隔层必须存放固定数量的书籍。以MySQL InnoDB的16KB页为例:
plaintext复制| Page Header (120B) | Row Records | Free Space | Page Directory | Trailer (8B) |
|--------------------|-------------|------------|----------------|--------------|
- 行记录:实际数据行,采用紧凑排列减少碎片
- 页目录:维护槽位(Slot)指针实现页内二分查找
- 溢出页:当行数据超过页大小时自动扩展
实测案例:某电商用户表约1.2GB数据,采用16KB页时理论需要约75,000次I/O才能全表扫描。通过索引可将此降低到3-4次。
2.2 行格式的演进与选择
不同场景需要不同的行存储格式,就像书籍有精装版和平装版:
-
Compact格式(MySQL 5.0+默认):
- 变长字段长度列表集中存放
- NULL值用位图标记节省空间
- 每行额外开销约3字节
-
Dynamic格式(MySQL 8.0默认):
- 完全避免行溢出问题
- 对于TEXT/BLOB字段仅存储20字节指针
- 适合包含大字段的表
sql复制-- 查看表的行格式
SHOW TABLE STATUS LIKE 'orders'\G
2.3 表空间管理机制
数据库文件就像图书馆的楼宇规划:
- 系统表空间:数据字典、undo日志等元数据
- 独立表空间(innodb_file_per_table=ON时):
bash复制/var/lib/mysql/ ├── ibdata1 # 系统表空间 ├── orders.ibd # 订单表独立表空间 └── users.ibd # 用户表独立表空间 - 段-区-页三级结构:
- 段(Segment):索引或表数据集合
- 区(Extent):64个连续页(默认1MB)
- 页(Page):最小分配单元
