mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
4160 字
12 分钟
数据库系统设计
2024-12-19

系列简介#

本系列受 Designing Data-Intensive Applications(DDIA)启发,从单机基础出发,逐步深入到分布式数据系统的核心挑战。与直接跳入某个数据库的内部实现不同,本系列先建立通用概念框架——存储引擎、索引、事务、查询优化——再以 MySQL、PostgreSQL、Redis 为实例,对比不同数据库的设计取舍,最终延伸到复制、分区、分布式事务与共识算法。

核心理念:先理解”为什么这样设计”,再理解”具体怎么实现”。

部分章节开头根据需要包含历史渊源和/或前置知识:历史渊源讲述该主题从起源到现代的演进脉络,帮助你理解”为什么现在是这样设计的”;前置知识列出阅读本章需要的理论基础和前序章节链接,帮助你按需补课。部分章节还包含**·附、实践**小节,用真实命令和输出验证理论知识。

系列定位#

  • 不是某个数据库的使用手册——而是理解所有数据库的思维方式
  • 不是从零手写数据库——而是读懂生产级数据库的设计决策
  • 从使用者到架构师的认知升级——知道何时选什么、为何这样选

场景驱动阅读路线#

不想按部就班地从第 1 章读到第 19 章?没问题。以下 5 条路线从你日常遇到的真实问题出发,按”你需要什么→数据库怎么实现”的顺序串联章节。每条路线可独立阅读,前置依赖已在路线内标注。

路线总览#

flowchart TB subgraph 路线A["路线A:我的查询为什么慢"] A1[Ch1 数据库全景] --> A2[Ch3 索引原理] A2 --> A3[Ch5 查询优化] A3 --> A4[Ch9 性能优化] A4 --> A5[Ch6 MySQL深入] end subgraph 路线B[" 路线B:数据一致性怎么保证"] B1[Ch1 数据库全景] --> B2[Ch4 事务与并发] B2 --> B3[Ch12 数据复制] B3 --> B4[Ch14 分布式事务] B4 --> B5[Ch15 一致性与共识] end subgraph 路线C[" 路线C:数据库怎么选怎么设计"] C1[Ch1 数据库全景] --> C2[Ch10 数据建模] C2 --> C3[Ch11 数据库选型] C3 --> C4[Ch2 存储引擎] C4 --> C5[Ch6/07/08 具体DB] end subgraph 路线D[" 路线D:数据量太大怎么办"] D1[Ch1 数据库全景] --> D2[Ch12 数据复制] D2 --> D3[Ch13 数据分区] D3 --> D4[Ch16 分库分表] D4 --> D5[Ch17 批流处理] end subgraph 路线E[" 路线E:数据库底层怎么实现的"] E1[Ch2 存储引擎] --> E2[Ch3 索引原理] E2 --> E3[Ch4 事务与并发] E3 --> E4[Ch6 MySQL] E4 --> E5[Ch7 PostgreSQL] E5 --> E6[Ch8 Redis] end subgraph 路线F[" 路线F:动手实践路线"] F1[Ch02·附 SQLite页结构] --> F2[Ch03·附 索引对比] F2 --> F3[Ch04·附 MVCC验证] F3 --> F4[Ch05·附 EXPLAIN解读] F4 --> F5[Ch07·附 VACUUM验证] F5 --> F6[Ch08·附 Redis数据结构] end style 路线A fill:#e3f2fd,stroke:#1565c0 style 路线B fill:#fce4ec,stroke:#c62828 style 路线C fill:#e8f5e9,stroke:#2e7d32 style 路线D fill:#fff3e0,stroke:#e65100 style 路线E fill:#f3e5f5,stroke:#6a1b9a style 路线F fill:#e0f7fa,stroke:#00695c

路线A:我的查询为什么慢#

场景:线上接口 P99 延迟飙升、慢查询日志一堆、加了索引还是慢、EXPLAIN 看不懂——问题到底出在哪?

顺序章节为什么读这章
1Ch1 数据库全景建立”存储模型→查询方式”的认知——行存/列存/内存数据库的性能天壤之别
2Ch3 索引原理核心:B+ 树/哈希/位图索引的适用场景、索引失效的根因、覆盖索引与索引下推
3Ch5 查询处理与优化理解优化器如何选择执行计划——统计信息失真比索引缺失更可怕
4Ch9 数据库性能优化系统性方法论:从慢查询到连接池到缓存,逐层排查
5Ch6 MySQL 深入InnoDB 特有的性能陷阱——Gap Lock、Next-Key Lock、Change Buffer

路线逻辑:先理解索引为什么能加速查询(Ch3),再理解优化器如何选择执行路径(Ch5),然后掌握系统性调优方法(Ch9),最后深入 MySQL 特有的实现细节(Ch6)。


路线B:数据一致性怎么保证#

场景:转账时钱不能丢、库存不能超卖、主从数据延迟导致读到旧值、分布式环境下如何保证原子性——一致性到底怎么保证?

顺序章节为什么读这章
1Ch1 数据库全景理解不同数据库对”一致性”的定义差异——这是后续所有讨论的基石
2Ch4 事务与并发控制核心:ACID、隔离级别、MVCC、2PL——单机一致性的完整理论框架
3Ch12 数据复制复制引入的一致性挑战——读写一致性、单调读、前缀一致读
4Ch14 分布式事务跨节点事务——2PC 的阻塞问题、Saga 的补偿模式、最终一致性
5Ch15 一致性与共识最强一致性保证——线性化、因果一致性、Raft 共识算法

路线逻辑:先掌握单机事务理论(Ch4),再理解复制引入的新问题(Ch12),然后学习跨节点事务方案(Ch14),最终理解共识算法如何实现最强一致性(Ch15)。


路线C:数据库怎么选怎么设计#

场景:新项目该用 MySQL 还是 PostgreSQL?要不要加 Redis 缓存?日志数据存 MongoDB 还是 Elasticsearch?Schema 怎么设计才能兼顾性能和扩展性?

顺序章节为什么读这章
1Ch1 数据库全景理解数据库分类体系——OLTP/OLAP、行存/列存、SQL/NoSQL 的本质区别
2Ch10 数据建模与 Schema 设计核心:范式与反范式、Schema 演化策略、编码格式选择
3Ch11 数据库选型与实践选型决策框架——RDBMS vs NoSQL vs NewSQL、CAP 定理的实践含义
4Ch2 存储引擎理解 B 树与 LSM 树的性能差异——写入密集型该选哪个?
5Ch6/07/08 具体数据库深入根据选型结果,深入所选数据库的实现细节

路线逻辑:先建立选型的认知框架(Ch1→Ch11),再学习 Schema 设计方法(Ch10),然后理解存储引擎对选型的影响(Ch2),最后深入所选数据库(Ch6/07/08)。


路线D:数据量太大怎么办#

场景:单表数据量过亿、写入 QPS 打满单机、主从延迟越来越大——如何从单机扩展到分布式?

顺序章节为什么读这章
1Ch1 数据库全景理解单机的性能天花板——为什么扩展是不可避免的
2Ch12 数据复制扩展第一步:读写分离——复制如何工作、延迟如何处理
3Ch13 数据分区扩展第二步:数据分片——范围/哈希分区、再平衡策略
4Ch16 分库分表与 NewSQL工程实践——Sharding 策略、分布式 ID、TiDB/CockroachDB 方案
5Ch17 批处理与流处理海量数据的处理——MapReduce、Spark、Flink、CDC

路线逻辑:从复制的读写分离(Ch12)到分区的水平扩展(Ch13),再到分库分表的工程实践(Ch16),最后处理海量数据的批流方案(Ch17)。


路线E:数据库底层怎么实现的#

场景:想深入理解数据库内部实现——数据怎么存在磁盘上?索引怎么加速查询?事务怎么保证原子性?不同数据库的实现有什么差异?

顺序章节为什么读这章
1Ch2 存储引擎地基:B 树 vs LSM 树、页结构、Buffer Pool、WAL——数据如何落盘
2Ch3 索引原理加速:B+ 树/哈希/位图/空间索引——查询如何被加速
3Ch4 事务与并发控制正确:ACID、MVCC、2PL、SSI——并发如何被安全地管理
4Ch6 MySQL 深入InnoDB 实现:聚簇索引、Gap Lock、Change Buffer、Doublewrite
5Ch7 PostgreSQL 深入PG 实现:xmin/xmax MVCC、VACUUM、HOT 更新、GiST/GIN/BRIN
6Ch8 Redis 深入内存数据库实现:SDS/跳表/压缩列表、RDB/AOF、Reactor 事件循环

路线逻辑:先理解三大核心机制的通用原理(存储→索引→事务),再对比三大数据库的实现差异——同样的概念,不同的取舍。


路线F:动手实践路线#

场景:你读完了理论,但还不知道怎么”动手验证”。这条路线串联各章的实践小节(·附、实践),用真实命令和输出验证理论知识。每个实践都可以独立运行,建议在虚拟机中操作。

顺序章节实践内容
1Ch02 存储引擎 ·附SQLite 页结构分析、WAL 模式切换
2Ch03 索引原理 ·附PostgreSQL B-tree/Hash/GIN/BRIN 索引对比
3Ch04 事务与并发控制 ·附PostgreSQL MVCC 的 xmin/xmax、死元组观察
4Ch05 查询处理与优化 ·附PostgreSQL EXPLAIN ANALYZE 解读
5Ch07 PostgreSQL 深入 ·附VACUUM 与 HOT 更新验证
6Ch08 Redis 深入 ·附Redis 数据结构编码、内存分析、RDB 持久化

路线逻辑:从存储引擎实践(SQLite 页结构)到索引实践(PostgreSQL 索引对比)到事务实践(MVCC 验证)到查询优化实践(EXPLAIN 解读),最后深入具体数据库实践(VACUUM/HOT、Redis 数据结构)。每个实践都包含可运行的命令和真实输出。


路线交叉参考#

同一章节在不同路线中的关注点不同:

章节路线A 关注点路线B 关注点路线C 关注点路线D 关注点路线E 关注点路线F 关注点
Ch1存储模型与性能一致性定义差异数据库分类体系单机天花板
Ch2B 树 vs LSM 选型数据落盘机制实践:SQLite 页结构
Ch3索引失效根因索引数据结构实践:索引类型对比
Ch4MVCC 与隔离并发控制实现实践:MVCC 验证
Ch5执行计划选择实践:EXPLAIN 解读
Ch6InnoDB 性能陷阱InnoDB 内部实现
Ch7PG MVCC 实现实践:VACUUM/HOT
Ch8Redis 数据结构实践:Redis 数据结构
Ch9系统性调优
Ch10Schema 设计
Ch11选型决策
Ch12复制一致性读写分离
Ch13数据分片
Ch14分布式事务
Ch15共识算法
Ch16分库分表实践
Ch17批流处理

知识导图#

以下导图展示 19 章知识之间的网络关系。与线性目录不同,这里强调跨层级的连接——一个”查询慢”的问题可能同时涉及存储引擎、索引设计、查询优化三个层级;一个”数据一致性”的问题可能从单机事务延伸到分布式共识。

概念关系图#

graph TB subgraph 应用层[" 应用层 — 你日常面对的问题"] SLOW["查询慢<br/>慢查询/索引/优化"] CONSIST["数据一致性<br/>事务/隔离/复制"] DESIGN["数据库选型与设计<br/>建模/选型/Schema"] SCALE["数据量扩展<br/>复制/分区/分库分表"] RELIABLE["数据库可靠性<br/>备份/容灾/监控"] end subgraph 机制层[" 机制层 — 数据库如何实现应用层的行为"] STORAGE["存储引擎<br/>Ch2"] INDEX["索引<br/>Ch3"] TXN["事务与并发<br/>Ch4"] QUERY["查询优化<br/>Ch5"] REPLICATION["数据复制<br/>Ch12"] PARTITION["数据分区<br/>Ch13"] DIST_TXN["分布式事务<br/>Ch14"] CONSENSUS["共识算法<br/>Ch15"] end subgraph 实现层[" 实现层 — 具体数据库的实现差异"] MYSQL["MySQL/InnoDB<br/>Ch6"] PG["PostgreSQL<br/>Ch7"] REDIS["Redis<br/>Ch8"] NEWSQL["NewSQL<br/>Ch16"] end subgraph 基础层[" 基础层 — 一切机制的共同地基"] DATAMODEL["数据模型<br/>Ch1"] ENCODE["编码与演化<br/>Ch10"] PERF["性能方法论<br/>Ch9"] BATCH["批流处理<br/>Ch17"] RELIAB["可靠性工程<br/>Ch18"] end %% 应用层 → 机制层 SLOW --> INDEX SLOW --> QUERY SLOW --> PERF CONSIST --> TXN CONSIST --> REPLICATION CONSIST --> DIST_TXN CONSIST --> CONSENSUS DESIGN --> DATAMODEL DESIGN --> ENCODE SCALE --> REPLICATION SCALE --> PARTITION RELIABLE --> RELIAB %% 机制层 → 实现层 STORAGE --> MYSQL STORAGE --> PG INDEX --> MYSQL INDEX --> PG TXN --> MYSQL TXN --> PG REPLICATION --> REDIS PARTITION --> NEWSQL CONSENSUS --> NEWSQL %% 跨层关键连接 STORAGE -.->|"B+树 vs LSM"| INDEX TXN -.->|"MVCC 实现"| MYSQL TXN -.->|"MVCC 实现"| PG REPLICATION -.->|"复制延迟"| DIST_TXN DIST_TXN -.->|"原子提交"| CONSENSUS BATCH -.->|"CDC"| REPLICATION RELIAB -.->|"WAL/备份"| STORAGE style 应用层 fill:#e8eaf6,stroke:#283593 style 机制层 fill:#e0f2f1,stroke:#00695c style 实现层 fill:#fff3e0,stroke:#e65100 style 基础层 fill:#fce4ec,stroke:#880e4f

章节网络关系图#

graph LR Ch0["Ch0 导读"] --> Ch1["Ch1 全景"] Ch1 --> Ch2["Ch2 存储引擎"] Ch1 --> Ch10["Ch10 数据建模"] Ch1 --> Ch11["Ch11 选型"] Ch2 --> Ch3["Ch3 索引"] Ch2 --> Ch6["Ch6 MySQL"] Ch2 --> Ch7["Ch7 PostgreSQL"] Ch3 --> Ch5["Ch5 查询优化"] Ch3 --> Ch6 Ch3 --> Ch7 Ch4["Ch4 事务"] --> Ch6 Ch4 --> Ch7 Ch4 --> Ch12["Ch12 复制"] Ch4 --> Ch14["Ch14 分布式事务"] Ch5 --> Ch9["Ch9 性能优化"] Ch6 --> Ch9 Ch7 --> Ch9 Ch8["Ch8 Redis"] --> Ch9 Ch10 --> Ch11 Ch10 -.->|"编码演化"| Ch2 Ch12 --> Ch13["Ch13 分区"] Ch12 --> Ch14 Ch12 -.->|"Redis复制"| Ch8 Ch13 --> Ch16["Ch16 分库分表"] Ch14 --> Ch15["Ch15 共识"] Ch15 --> Ch16 Ch16 --> Ch17["Ch17 批流处理"] Ch9 --> Ch18["Ch18 可靠性"] Ch17 --> Ch19["Ch19 综合实战"] Ch18 --> Ch19 style Ch0 fill:#bbdefb,stroke:#1565c0 style Ch2 fill:#c8e6c9,stroke:#2e7d32 style Ch4 fill:#fff9c4,stroke:#f9a825 style Ch12 fill:#ffe0b2,stroke:#e65100 style Ch15 fill:#e1bee7,stroke:#6a1b9a style Ch19 fill:#ffcdd2,stroke:#c62828

知识关联参考表#

按四层模型组织:应用层(你日常遇到的问题)→ 机制层(数据库如何实现)→ 实现层(具体数据库的差异)→ 基础层(共享的基础设施)。同一行的条目之间存在直接的知识依赖或概念映射。

应用问题对应章节核心机制对应章节具体实现对应章节
查询慢Ch9索引选择与失效Ch3InnoDB 索引实现Ch6
查询慢Ch9优化器执行计划Ch5PG 代价模型Ch7
数据不一致Ch4MVCC 与隔离级别Ch4InnoDB vs PG MVCCCh6, Ch7
主从延迟Ch12复制与一致性Ch12Redis 主从复制Ch8
分布式事务Ch142PC/Saga/TCCCh14TiDB 分布式事务Ch16
数据量扩展Ch13分区与再平衡Ch13Sharding 策略Ch16
Schema 设计Ch10范式与编码Ch10多数据库 SchemaCh11
写入瓶颈Ch2LSM 树 vs B 树Ch2InnoDB vs RocksDBCh6
缓存穿透Ch9缓存策略Ch9Redis 缓存模式Ch8
容灾恢复Ch18WAL 与备份Ch18MySQL/PG 备份恢复Ch6, Ch7

系列大纲#

以下是按章节编号排列的完整目录。建议结合上方的场景驱动阅读路线知识导图选择适合你的阅读顺序。

Part 1:基础篇 — 数据库核心概念#

章节标题核心内容
1数据库全景数据模型(关系/文档/图/键值)、查询语言、存储模型(行存/列存)、OLTP/OLAP/HTAP、数据库分类体系
2存储引擎B 树 vs LSM 树、页结构、Buffer Pool、WAL、检查点、InnoDB/RocksDB 对比
3索引原理B+ 树/哈希/位图/空间索引、覆盖索引、索引下推、最左前缀、索引失效分析
4事务与并发控制ACID、隔离级别、MVCC 原理、2PL、死锁、SSI、MySQL vs PostgreSQL 对比
5查询处理与优化SQL 处理流水线、代价模型、启发式优化、统计信息、EXPLAIN 跨数据库解读

Part 2:实战篇 — 主流数据库深入#

章节标题核心内容
6MySQL 深入InnoDB 架构、行格式、聚簇索引、Gap Lock/Next-Key Lock、Change Buffer、Doublewrite
7PostgreSQL 深入xmin/xmax MVCC、VACUUM、HOT 更新、GiST/GIN/BRIN 索引、代价估计器
8Redis 深入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分库分表与 NewSQLSharding 策略、分布式 ID、跨分片查询、TiDB/CockroachDB/OceanBase

Part 4:衍生篇 — 数据处理与可靠性#

章节标题核心内容
17批处理与流处理MapReduce、Spark、Flink、CDC、Event Sourcing、流表二象性
18数据库可靠性备份恢复、容灾方案、RPO/RTO、混沌工程、多地域部署
19综合实战端到端设计一个真实系统的数据库架构,综合运用前 18 章知识

实践环境搭建#

Docker Compose 一键启动#

# 创建 docker-compose.yml
cat > 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 — 高级数据库系统

官方文档#


准备好开始了吗?从 数据库全景 开始你的数据库系统设计之旅吧!


参考#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

数据库系统设计
https://blog.souloss.com/posts/database/database-series-guide/
作者
Souloss
发布于
2024-12-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时