PostgreSQL 系列

PostgreSQL 系列

MySQL 那一套讲的是「一台机器怎么跑、两台机器怎么同步」。PG 我换个讲法:先讲和 MySQL 不一样的地方——因为你已经有底子,需要的不是从零学一遍,而是知道哪些肌肉记忆必须改。

两个可交互的图解

单文件、不依赖网络,点开新窗口看:

图 能做什么
第一辑:存储与 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(物理)
同步备库挂了 自动降级 阻塞主库写入

这七条我在两篇文章里都展开了。真要面试,能把这七条说清楚,比背十个参数有用。