SQL数据库存储层抽象_逻辑结构与物理映射

8次阅读

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

SQL 数据库存储层抽象_逻辑结构与物理映射

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)可跨版本、跨引擎复用,屏蔽底层格式差异
text=ZqhQzanResources