KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
PostgreSQL 工程课:MVCC、膨胀与复制 — keel 龙骨
不教怎么写 SQL,而是教数据库内部拿什么代价换来了你现在用的语义:一条 UPDATE 为什么不是原地改、快照可见性与隔离级别的差别落在哪一行、VACUUM 与表膨胀怎么量怎么治、WAL 与检查点的落盘顺序、索引结构与执行计划的选择依据、锁等待链与死锁检测、事务 ID 回卷的数学边界、流复制与逻辑复制及复制槽的风险、声明式分区的真实收益边界。
不教怎么写 SQL,而是教数据库内部拿什么代价换来了你现在用的语义:一条 UPDATE 为什么不是原地改、快照可见性与隔离级别的差别落在哪一行、VACUUM 与表膨胀怎么量怎么治、WAL 与检查点的落盘顺序、索引结构与执行计划的选择依据、锁等待链与死锁检测、事务 ID 回卷的数学边界、流复制与逻辑复制及复制槽的风险、声明式分区的真实收益边界。
章节目录
- 00 · 一条 UPDATE 改了什么 — 先说一个我自己踩过的坑。早些年排查一个「表越用越大但行数没变」的问题,我第一反应是索引膨胀、或者是没删干净的历史数据。查到最后发现表里从头到尾就一行——一条被业务反复更新的计数器。那一刻才真正接受一件事:在 PostgreSQL 里,UPDATE 不是把那一行改掉,而是把旧版本标死、再写一个新版本。
- 01 · MVCC 与隔离级别 — 第 00 章留下的问题是:一行在磁盘上有两个版本,那查询到底该看哪一个?
- 02 · VACUUM 与表膨胀 — 第 01 章结尾留了一个因果链:老快照会让死版本清不掉。这一章把这条链走完——死元组从哪来、autovacuum 什么时候才动手、膨胀怎么量、VACUUM 和 VACUUM FULL 到底把空间还给了谁。
- 03 · WAL、检查点与崩溃恢复 — 第 00 章里我留了一句「真正决定改动会不会丢的是刷盘时机」。这一章把它讲完。
- 04 · 索引与执行计划 — 前面三章讲的是「写进去的东西为什么正确」。这一章换个方向:读出来为什么快,或者为什么慢。
- 05 · 锁与并发冲突 — 第 01 章讲过并发更新的两种结局:RC 下排队等锁、RR 下直接报序列化失败。这一章把中间那部分补上——锁到底加在哪、谁在等谁、死锁是怎么被发现的。
- 06 · 复制、分区与选型 — 前面五章都在单机上。这一章把数据放到第二台机器上,并且回答两个反复被问到的问题:流复制和逻辑复制到底差在哪,以及分区到底解决什么、不解决什么。末尾用 pgvector 给一个「PostgreSQL 的边界在哪」的具体数字。