PostgreSQL 系列
PostgreSQL 系列
MySQL 那一套讲的是「一台机器怎么跑、两台机器怎么同步」。PG 我换个讲法:先讲和 MySQL 不一样的地方——因为你已经有底子,需要的不是从零学一遍,而是知道哪些肌肉记忆必须改。
多进程模型 · 堆表与回表 · 行内多版本 · VACUUM · 与 MySQL 十项对照
物理流复制 · 五个同步档位 · 复制槽 · 逻辑复制 · PITR 与 pg_rewind · Patroni
两个可交互的图解
单文件、不依赖网络,点开新窗口看:
| 图 | 能做什么 |
|---|---|
| 第一辑:存储与 MVCC | 拖连接数看进程内存怎么爆、切访问路径看回表、切时间点看两个事务各读到哪个版本、拖事务年龄看离回卷还有多远 |
| 第二辑:复制与高可用 | 一步步看 WAL 怎么从主库流到从库、五个 synchronous_commit 档位各等谁、切备库状态看复制槽怎么把磁盘吃满、拖时间轴看 PITR 恢复到哪一秒 |
为什么先讲这五件事
从 MySQL 过来,最容易出事的不是「不会用」,是带着 MySQL 的直觉去用。这几条几乎每条都会变成线上问题:
- 以为连接是线程 → 连接数开到几百,内存直接爆。PG 是一连接一进程,必须上 PgBouncer。
- 以为主键是聚簇索引 → 按主键查以为是一次 IO,实际是两次。索引设计思路完全不同。
- 以为回滚会释放空间 → PG 的旧版本留在表里,不清就膨胀。
- 以为 RR 靠间隙锁防幻读 → PG 没有间隙锁,靠快照;代价是写冲突直接报错,业务必须重试。
- 以为
VACUUM FULL就是「整理一下」 → 它锁全表,大表上等于停服。
一个必须先知道的版本事实
2026 年 11 月这个时间点:稳定版是 18.6,19 计划 11 月 19 日 GA(带 REPACK、autovacuum 并行、pg_plan_advice),14 从今天起停止维护。
网上的 PG 教程有一大半写于 9.x / 10 时代,那时候还没有声明式分区、没有 pg_stat_progress_vacuum、没有并行 vacuum。照抄会踩坑,所以文中参数都以 18 为准。
和 MySQL 系列的关系
两边不是替代关系,是互相对照。同一个问题在两边的答案经常相反:
| 问题 | MySQL | PostgreSQL |
|---|---|---|
| 表数据存在哪 | 主键索引的叶子 | 独立的堆文件 |
| 旧版本存在哪 | undo log | 表里 |
| 事务 ID 会绕回吗 | 不会 | 会,必须 freeze |
| 默认隔离级别 | RR | RC |
| 防幻读靠什么 | 间隙锁 + MVCC | 快照 |
| 复制传什么 | binlog(逻辑) | WAL(物理) |
| 同步备库挂了 | 自动降级 | 阻塞主库写入 |
这七条我在两篇文章里都展开了。真要面试,能把这七条说清楚,比背十个参数有用。