SQL数据库存储层抽象的核心是逻辑结构(表、索引等)与物理实现(文件、页、行偏移等)的分离,通过元数据、缓冲池、WAL和统计信息桥接二者,支撑跨磁盘分布、在线索引、物理备份、优化器决策及跨引擎迁移等关键能力。

SQL数据库的存储层抽象,核心在于把用户看到的表、列、索引等逻辑对象,与磁盘上的文件、页、块、行偏移等物理实现隔离开来。这种分离让开发者专注数据建模,而数据库系统负责高效存取。
逻辑结构:用户视角的数据组织
逻辑层是SQL标准定义的、用户直接操作的部分,不依赖具体存储方式:
- 数据库(Database):命名空间容器,用于隔离不同应用或租户的数据
- 模式(Schema):逻辑分组单元,包含表、视图、函数等;可对应用户、项目或业务域
- 表(Table):二维关系结构,由行(Row/Tuple)和列(Column/Attribute)构成;列有明确类型与约束
- 索引(Index):逻辑上加速查询的有序结构(如B+树、哈希),不改变表语义,仅优化访问路径
- 视图(View):虚拟表,基于查询定义,无独立物理存储,逻辑上封装复杂逻辑
物理映射:数据如何真正落盘
物理层由存储引擎实现,将逻辑对象映射为操作系统可管理的资源:
- 文件(File):一个数据库通常对应多个文件(如MySQL的.ibd、PostgreSQL的base目录下段文件);文件名常含OID或relfilenode,隐式关联逻辑对象
- 页(Page / Block):I/O最小单位(常见16KB或8KB);每页存多行数据或索引节点;页头含校验、LSN、空闲空间指针等元信息
- 行存储格式:实际按页内偏移存放,可能含NULL位图、变长字段偏移数组、事务ID(如MVCC的xmin/xmax)、行头长度标记等
- 聚簇与非聚簇:InnoDB中主键索引即聚簇索引,表数据按主键顺序物理存储;Secondary Index叶子节点存主键值而非行指针
- 段(Segment)与区(Extent):如SQL Server或Oracle中用于管理空间分配的抽象层,避免碎片化;PostgreSQL用FSM(Free Space Map)跟踪页空闲度
抽象桥接的关键机制
数据库通过元数据与运行时结构维持逻辑-物理一致性:
- 系统目录表:如pg_class(PostgreSQL)、sys.tables(SQL Server)、INFORMATION_SCHEMA.TABLES,记录对象OID、所属表空间、文件路径、列定义等
- 缓冲池(Buffer Pool):内存中页的缓存,通过页号(Page ID)定位物理位置;逻辑查询经解析后转换为对特定页的读写请求
- 重做日志(Redo Log)与WAL:保证物理修改的持久性与恢复能力;日志记录的是“在某页某偏移写入某值”,而非SQL语句
- 统计信息:如pg_statistic或MySQL的histogram,帮助优化器估算逻辑操作(如JOIN、FILTER)对应的物理I/O代价
为什么这个抽象很重要
它支撑了现代数据库的核心能力:
- 同一张表可在不同表空间(甚至不同磁盘)分布,用户无需感知迁移过程
- 添加索引不阻塞DML(多数引擎支持在线创建),因为新增的是独立物理结构
- 备份工具可直接拷贝数据文件(物理备份),只要配合日志即可恢复到一致状态
- 查询优化器基于逻辑谓词推导执行计划,再结合物理统计选择最优访问路径(如走索引扫描还是全表扫描)
- 升级或迁移时,逻辑导出(如pg_dump)可跨版本、跨引擎复用,屏蔽底层格式差异










