如何设计一个数据库
按 MiniDB 失败顺序设计 DBMS:存得住、找得到、查得快、改得对、崩了能恢复。
目标:不是给业务系统建表,而是设计数据库软件本身。第一版只支持几条 SQL,但每一步都要能解释为什么需要这个内部机制。
CREATE TABLE users(id int, name text);
INSERT INTO users VALUES (1, 'alice');
SELECT * FROM users WHERE id = 1;
UPDATE users SET name = 'bob' WHERE id = 1;
COMMIT;
-- kill process, restart
SELECT * FROM users WHERE id = 1; -- still exists
| 失败 | 长出的机制 |
| 内存 Map 重启就丢。 | 文件、页、记录格式。 |
| 文件能存,但不知道一条记录在哪。 | page_id、slot_id、RID。 |
| 每次读磁盘太慢。 | Buffer Pool。 |
| 按 id 查要扫全表。 | B+Tree 索引。 |
| SQL 只是字符串。 | Parser、Binder、Executor。 |
| 多个计划都能跑,但快慢差很多。 | Optimizer。 |
| 两个事务同时写坏数据。 | 事务管理、锁、隔离。 |
| 崩溃后不知道保留谁、撤销谁。 | WAL、Redo、Undo、Checkpoint。 |
| 读写互相阻塞。 | MVCC。 |
一句话:设计一个数据库,就是设计“行怎样落盘、记录怎样定位、查询怎样执行和优化、并发怎样正确、崩溃怎样恢复、读写怎样共存”。