系列简介
本系列受 Designing Data-Intensive Applications(DDIA)启发,从单机基础出发,逐步深入到分布式数据系统的核心挑战。与直接跳入某个数据库的内部实现不同,本系列先建立通用概念框架——存储引擎、索引、事务、查询优化——再以 MySQL、PostgreSQL、Redis 为实例,对比不同数据库的设计取舍,最终延伸到复制、分区、分布式事务与共识算法。
核心理念:先理解”为什么这样设计”,再理解”具体怎么实现”。
部分章节开头根据需要包含历史渊源和/或前置知识:历史渊源讲述该主题从起源到现代的演进脉络,帮助你理解”为什么现在是这样设计的”;前置知识列出阅读本章需要的理论基础和前序章节链接,帮助你按需补课。部分章节还包含**·附、实践**小节,用真实命令和输出验证理论知识。
系列定位
- 不是某个数据库的使用手册——而是理解所有数据库的思维方式
- 不是从零手写数据库——而是读懂生产级数据库的设计决策
- 是从使用者到架构师的认知升级——知道何时选什么、为何这样选
场景驱动阅读路线
不想按部就班地从第 1 章读到第 19 章?没问题。以下 5 条路线从你日常遇到的真实问题出发,按”你需要什么→数据库怎么实现”的顺序串联章节。每条路线可独立阅读,前置依赖已在路线内标注。
路线总览
路线A:我的查询为什么慢
场景:线上接口 P99 延迟飙升、慢查询日志一堆、加了索引还是慢、EXPLAIN 看不懂——问题到底出在哪?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 数据库全景 | 建立”存储模型→查询方式”的认知——行存/列存/内存数据库的性能天壤之别 |
| 2 | Ch3 索引原理 | 核心:B+ 树/哈希/位图索引的适用场景、索引失效的根因、覆盖索引与索引下推 |
| 3 | Ch5 查询处理与优化 | 理解优化器如何选择执行计划——统计信息失真比索引缺失更可怕 |
| 4 | Ch9 数据库性能优化 | 系统性方法论:从慢查询到连接池到缓存,逐层排查 |
| 5 | Ch6 MySQL 深入 | InnoDB 特有的性能陷阱——Gap Lock、Next-Key Lock、Change Buffer |
路线逻辑:先理解索引为什么能加速查询(Ch3),再理解优化器如何选择执行路径(Ch5),然后掌握系统性调优方法(Ch9),最后深入 MySQL 特有的实现细节(Ch6)。
路线B:数据一致性怎么保证
场景:转账时钱不能丢、库存不能超卖、主从数据延迟导致读到旧值、分布式环境下如何保证原子性——一致性到底怎么保证?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 数据库全景 | 理解不同数据库对”一致性”的定义差异——这是后续所有讨论的基石 |
| 2 | Ch4 事务与并发控制 | 核心:ACID、隔离级别、MVCC、2PL——单机一致性的完整理论框架 |
| 3 | Ch12 数据复制 | 复制引入的一致性挑战——读写一致性、单调读、前缀一致读 |
| 4 | Ch14 分布式事务 | 跨节点事务——2PC 的阻塞问题、Saga 的补偿模式、最终一致性 |
| 5 | Ch15 一致性与共识 | 最强一致性保证——线性化、因果一致性、Raft 共识算法 |
路线逻辑:先掌握单机事务理论(Ch4),再理解复制引入的新问题(Ch12),然后学习跨节点事务方案(Ch14),最终理解共识算法如何实现最强一致性(Ch15)。
路线C:数据库怎么选怎么设计
场景:新项目该用 MySQL 还是 PostgreSQL?要不要加 Redis 缓存?日志数据存 MongoDB 还是 Elasticsearch?Schema 怎么设计才能兼顾性能和扩展性?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 数据库全景 | 理解数据库分类体系——OLTP/OLAP、行存/列存、SQL/NoSQL 的本质区别 |
| 2 | Ch10 数据建模与 Schema 设计 | 核心:范式与反范式、Schema 演化策略、编码格式选择 |
| 3 | Ch11 数据库选型与实践 | 选型决策框架——RDBMS vs NoSQL vs NewSQL、CAP 定理的实践含义 |
| 4 | Ch2 存储引擎 | 理解 B 树与 LSM 树的性能差异——写入密集型该选哪个? |
| 5 | Ch6/07/08 具体数据库深入 | 根据选型结果,深入所选数据库的实现细节 |
路线逻辑:先建立选型的认知框架(Ch1→Ch11),再学习 Schema 设计方法(Ch10),然后理解存储引擎对选型的影响(Ch2),最后深入所选数据库(Ch6/07/08)。
路线D:数据量太大怎么办
场景:单表数据量过亿、写入 QPS 打满单机、主从延迟越来越大——如何从单机扩展到分布式?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch1 数据库全景 | 理解单机的性能天花板——为什么扩展是不可避免的 |
| 2 | Ch12 数据复制 | 扩展第一步:读写分离——复制如何工作、延迟如何处理 |
| 3 | Ch13 数据分区 | 扩展第二步:数据分片——范围/哈希分区、再平衡策略 |
| 4 | Ch16 分库分表与 NewSQL | 工程实践——Sharding 策略、分布式 ID、TiDB/CockroachDB 方案 |
| 5 | Ch17 批处理与流处理 | 海量数据的处理——MapReduce、Spark、Flink、CDC |
路线逻辑:从复制的读写分离(Ch12)到分区的水平扩展(Ch13),再到分库分表的工程实践(Ch16),最后处理海量数据的批流方案(Ch17)。
路线E:数据库底层怎么实现的
场景:想深入理解数据库内部实现——数据怎么存在磁盘上?索引怎么加速查询?事务怎么保证原子性?不同数据库的实现有什么差异?
| 顺序 | 章节 | 为什么读这章 |
|---|---|---|
| 1 | Ch2 存储引擎 | 地基:B 树 vs LSM 树、页结构、Buffer Pool、WAL——数据如何落盘 |
| 2 | Ch3 索引原理 | 加速:B+ 树/哈希/位图/空间索引——查询如何被加速 |
| 3 | Ch4 事务与并发控制 | 正确:ACID、MVCC、2PL、SSI——并发如何被安全地管理 |
| 4 | Ch6 MySQL 深入 | InnoDB 实现:聚簇索引、Gap Lock、Change Buffer、Doublewrite |
| 5 | Ch7 PostgreSQL 深入 | PG 实现:xmin/xmax MVCC、VACUUM、HOT 更新、GiST/GIN/BRIN |
| 6 | Ch8 Redis 深入 | 内存数据库实现:SDS/跳表/压缩列表、RDB/AOF、Reactor 事件循环 |
路线逻辑:先理解三大核心机制的通用原理(存储→索引→事务),再对比三大数据库的实现差异——同样的概念,不同的取舍。
路线F:动手实践路线
场景:你读完了理论,但还不知道怎么”动手验证”。这条路线串联各章的实践小节(
·附、实践),用真实命令和输出验证理论知识。每个实践都可以独立运行,建议在虚拟机中操作。
| 顺序 | 章节 | 实践内容 |
|---|---|---|
| 1 | Ch02 存储引擎 ·附 | SQLite 页结构分析、WAL 模式切换 |
| 2 | Ch03 索引原理 ·附 | PostgreSQL B-tree/Hash/GIN/BRIN 索引对比 |
| 3 | Ch04 事务与并发控制 ·附 | PostgreSQL MVCC 的 xmin/xmax、死元组观察 |
| 4 | Ch05 查询处理与优化 ·附 | PostgreSQL EXPLAIN ANALYZE 解读 |
| 5 | Ch07 PostgreSQL 深入 ·附 | VACUUM 与 HOT 更新验证 |
| 6 | Ch08 Redis 深入 ·附 | Redis 数据结构编码、内存分析、RDB 持久化 |
路线逻辑:从存储引擎实践(SQLite 页结构)到索引实践(PostgreSQL 索引对比)到事务实践(MVCC 验证)到查询优化实践(EXPLAIN 解读),最后深入具体数据库实践(VACUUM/HOT、Redis 数据结构)。每个实践都包含可运行的命令和真实输出。
路线交叉参考
同一章节在不同路线中的关注点不同:
| 章节 | 路线A 关注点 | 路线B 关注点 | 路线C 关注点 | 路线D 关注点 | 路线E 关注点 | 路线F 关注点 |
|---|---|---|---|---|---|---|
| Ch1 | 存储模型与性能 | 一致性定义差异 | 数据库分类体系 | 单机天花板 | — | — |
| Ch2 | — | — | B 树 vs LSM 选型 | — | 数据落盘机制 | 实践:SQLite 页结构 |
| Ch3 | 索引失效根因 | — | — | — | 索引数据结构 | 实践:索引类型对比 |
| Ch4 | — | MVCC 与隔离 | — | — | 并发控制实现 | 实践:MVCC 验证 |
| Ch5 | 执行计划选择 | — | — | — | — | 实践:EXPLAIN 解读 |
| Ch6 | InnoDB 性能陷阱 | — | — | — | InnoDB 内部实现 | — |
| Ch7 | — | — | — | — | PG MVCC 实现 | 实践:VACUUM/HOT |
| Ch8 | — | — | — | — | Redis 数据结构 | 实践:Redis 数据结构 |
| Ch9 | 系统性调优 | — | — | — | — | — |
| Ch10 | — | — | Schema 设计 | — | — | — |
| Ch11 | — | — | 选型决策 | — | — | — |
| Ch12 | — | 复制一致性 | — | 读写分离 | — | — |
| Ch13 | — | — | — | 数据分片 | — | — |
| Ch14 | — | 分布式事务 | — | — | — | — |
| Ch15 | — | 共识算法 | — | — | — | — |
| Ch16 | — | — | — | 分库分表实践 | — | — |
| Ch17 | — | — | — | 批流处理 | — | — |
知识导图
以下导图展示 19 章知识之间的网络关系。与线性目录不同,这里强调跨层级的连接——一个”查询慢”的问题可能同时涉及存储引擎、索引设计、查询优化三个层级;一个”数据一致性”的问题可能从单机事务延伸到分布式共识。
概念关系图
章节网络关系图
知识关联参考表
按四层模型组织:应用层(你日常遇到的问题)→ 机制层(数据库如何实现)→ 实现层(具体数据库的差异)→ 基础层(共享的基础设施)。同一行的条目之间存在直接的知识依赖或概念映射。
| 应用问题 | 对应章节 | 核心机制 | 对应章节 | 具体实现 | 对应章节 |
|---|---|---|---|---|---|
| 查询慢 | Ch9 | 索引选择与失效 | Ch3 | InnoDB 索引实现 | Ch6 |
| 查询慢 | Ch9 | 优化器执行计划 | Ch5 | PG 代价模型 | Ch7 |
| 数据不一致 | Ch4 | MVCC 与隔离级别 | Ch4 | InnoDB vs PG MVCC | Ch6, Ch7 |
| 主从延迟 | Ch12 | 复制与一致性 | Ch12 | Redis 主从复制 | Ch8 |
| 分布式事务 | Ch14 | 2PC/Saga/TCC | Ch14 | TiDB 分布式事务 | Ch16 |
| 数据量扩展 | Ch13 | 分区与再平衡 | Ch13 | Sharding 策略 | Ch16 |
| Schema 设计 | Ch10 | 范式与编码 | Ch10 | 多数据库 Schema | Ch11 |
| 写入瓶颈 | Ch2 | LSM 树 vs B 树 | Ch2 | InnoDB vs RocksDB | Ch6 |
| 缓存穿透 | Ch9 | 缓存策略 | Ch9 | Redis 缓存模式 | Ch8 |
| 容灾恢复 | Ch18 | WAL 与备份 | Ch18 | MySQL/PG 备份恢复 | Ch6, Ch7 |
系列大纲
以下是按章节编号排列的完整目录。建议结合上方的场景驱动阅读路线和知识导图选择适合你的阅读顺序。
Part 1:基础篇 — 数据库核心概念
Part 2:实战篇 — 主流数据库深入
| 章节 | 标题 | 核心内容 |
|---|---|---|
| 6 | MySQL 深入 | InnoDB 架构、行格式、聚簇索引、Gap Lock/Next-Key Lock、Change Buffer、Doublewrite |
| 7 | PostgreSQL 深入 | xmin/xmax MVCC、VACUUM、HOT 更新、GiST/GIN/BRIN 索引、代价估计器 |
| 8 | Redis 深入 | SDS/跳表/压缩列表/整数集合、对象系统、RDB/AOF、主从复制、Reactor 事件循环 |
| 9 | 数据库性能优化 | 慢查询分析、连接池、缓存策略、参数调优、监控体系 |
| 10 | 数据建模与 Schema 设计 | 范式与反范式、Schema 演化、编码格式(JSON/Protobuf/Avro)、迁移策略 |
| 11 | 数据库选型与实践 | RDBMS vs NoSQL vs NewSQL、CAP 定理实践、多语言持久化、选型决策框架 |
Part 3:分布式篇 — 分布式数据系统
| 章节 | 标题 | 核心内容 |
|---|---|---|
| 12 | 数据复制 | 单主/多主/无主复制、复制延迟、读写一致性、单调读、前缀一致读 |
| 13 | 数据分区 | 范围/哈希分区、二级索引分区、热点缓解、再平衡策略 |
| 14 | 分布式事务 | 2PC/3PC、Saga 模式、TCC、最终一致性、冲突解决 |
| 15 | 一致性与共识 | 线性化、因果一致性、全序广播、Raft/Paxos、Fencing Token |
| 16 | 分库分表与 NewSQL | Sharding 策略、分布式 ID、跨分片查询、TiDB/CockroachDB/OceanBase |
Part 4:衍生篇 — 数据处理与可靠性
实践环境搭建
Docker Compose 一键启动
# 创建 docker-compose.ymlcat > docker-compose.yml << 'EOF'version: "3.8"services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: testdb ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql
postgres: image: postgres:16 environment: POSTGRES_PASSWORD: root POSTGRES_DB: testdb ports: - "5432:5432" volumes: - pg_data:/var/lib/postgresql/data
redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data
volumes: mysql_data: pg_data: redis_data:EOF
# 启动所有数据库docker compose up -d
# 验证连接docker compose exec mysql mysql -uroot -proot -e "SELECT VERSION();"docker compose exec postgres psql -U postgres -c "SELECT version();"docker compose exec redis redis-cli ping示例数据初始化
-- MySQL / PostgreSQL 通用建表语句CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, age INT, city VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE orders ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'pending', amount DECIMAL(10,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_user_id (user_id), INDEX idx_status_created (status, created_at));本系列的方法论
本系列遵循 问题 → 直觉 → 形式化 → 实现 → 权衡 的学习路径:
description: “1. 问题:从真实场景出发——“查询为什么慢?""数据为什么不一致?” description: “2. 直觉:建立对解决方案的直觉——“加索引应该能加速""加锁应该能防冲突” 3. 形式化:将直觉精确化——B+ 树的复杂度分析、隔离级别的形式化定义 4. 实现:看真实数据库怎么做——InnoDB 的 B+ 树、PostgreSQL 的 MVCC 5. 权衡:理解设计取舍——为什么 MySQL 用 Undo Log 而 PostgreSQL 用 Append-Only
每章都遵循这一方法论,让你不仅知道”是什么”,更理解”为什么这样设计”。
推荐参考资料
经典教材
| 书籍 | 作者 | 特点 |
|---|---|---|
| 《Designing Data-Intensive Applications》 | Martin Kleppmann | 本系列的核心灵感来源,概念先行、对比取舍 |
| 《Database Internals》 | Alex Petrov | 深入存储引擎与分布式系统实现 |
| 《Architecture of a Database System》 | Joseph Hellerstein 等 | 数据库架构的经典综述论文 |
| 《高性能 MySQL》 | Baron Schwartz 等 | MySQL 实践优化的权威指南 |
| 《Redis 设计与实现》 | 黄健宏 | Redis 内部实现的中文最佳参考 |
| 《PostgreSQL 指南:内幕探索》 | Hironobu Suzuki 等 | PostgreSQL 内部机制的实践指南 |
在线课程
- CMU 15-445/645 — 数据库系统(Andy Pavlo 教授,强烈推荐)
- MIT 6.824 — 分布式系统(Robert Morris 教授)
- CMU 15-721 — 高级数据库系统
官方文档
准备好开始了吗?从 数据库全景 开始你的数据库系统设计之旅吧!
参考
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






