什么是存储引擎?
存储引擎是数据库管理系统的核心组件,负责数据在磁盘和内存之间的组织、存取和持久化。它直接决定了数据库的读写性能、空间利用率和数据可靠性。
核心职责
┌──────────────────────────────────────────┐
│ 存储引擎 │
├──────────────────────────────────────────┤
│ 页面管理 │ 缓冲池 │ 文件组织 │
│ 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 开销 |
本系列内容
本章节将系统讲解存储引擎的各个核心组件:
- 缓冲池管理与页面替换算法
- 页面布局:Slotted Pages 与日志结构
- 数据文件组织方式
- 压缩与编码技术
参考
- PostgreSQL 文档: Database Physical Storage
- MySQL 文档: InnoDB Storage Engine
- Alex Petrov, Database Internals, Chapter 1-3