什么是存储引擎?

存储引擎是数据库管理系统的核心组件,负责数据在磁盘和内存之间的组织、存取和持久化。它直接决定了数据库的读写性能、空间利用率和数据可靠性。

核心职责

┌──────────────────────────────────────────┐
│              存储引擎                      │
├──────────────────────────────────────────┤
│  页面管理    │  缓冲池    │  文件组织      │
│  Page Layout │ Buffer Pool│ File Layout   │
├──────────────┼───────────┼───────────────┤
│  事务日志    │  空间回收  │  压缩/编码     │
│  WAL         │  Vacuum   │  Compression   │
└──────────────────────────────────────────┘

1. 页面管理

数据库将数据划分为固定大小的页面(Page)(通常 4KB-16KB),作为 IO 的最小单元。页面内部布局决定了:

  • 如何存储一行数据
  • 如何处理变长字段
  • 如何支持快速查找

常见布局:

  • Slotted Pages:页面末尾维护槽数组,指向行偏移(PostgreSQL、MySQL)
  • 日志结构:追加写入,不覆盖旧数据(LSM-Tree、RocksDB)
  • PAX:页面内按列分组(DuckDB)

2. 缓冲池

缓冲池是内存中的页面缓存,减少磁盘 IO。核心问题:

  • 替换策略:选择哪个页面淘汰(LRU、Clock、LRU-K)
  • 并发控制:多线程读写同一页面的锁管理
  • 预取:提前加载可能需要的页面

3. 文件组织

数据在磁盘上的布局方式:

  • 堆文件 (Heap):页面链成链表,支持随机读写
  • B+Tree:主键索引本身即数据存储(MySQL InnoDB 聚簇索引)
  • LSM-Tree:顺序写入 + 后台 Compaction,优化写性能

为什么存储引擎选择很重要?

不同存储引擎的设计取舍截然不同:

场景 推荐存储 原因
OLTP(高并发读写) B+Tree(InnoDB) 点查快,事务支持好
OLAP(分析查询) 列存(DuckDB) 扫描密集,列式高效
日志/时序写入 LSM(RocksDB) 顺序写极快
内存数据库 内存 B+Tree / 跳表 无磁盘 IO 开销

本系列内容

本章节将系统讲解存储引擎的各个核心组件:

  1. 缓冲池管理与页面替换算法
  2. 页面布局:Slotted Pages 与日志结构
  3. 数据文件组织方式
  4. 压缩与编码技术

参考