SERIOUS · TYPE · CONSTRAINT · TRANSACTION · PLAN · 一台把数据当真的引擎

当真

P O S T G R E S Q L

你会写 SQL。SELECTJOINGROUP BY 都不在话下,MySQL 也用了好几年。可要说 PostgreSQL 到底哪里不一样,你大概只能答出「听说它更强大」。

这本书的答案,是两个字:当真。你给 MySQL 一个不存在的日期 '2026-02-30',它悄悄存成 0000-00-00;一个超长字符串,它悄悄截断;一句非法整数,它悄悄取 0。它把你的错误吞下去,若无其事。PostgreSQL 只有一种脾气:不合规,就当场拒绝,整个事务一起回滚。类型当真、约束当真、事务当真——甚至连你写的那句 SELECT 它都当真,认认真真替你估算成本、挑出最省的执行路径。

全书围着这两个字转。而且它是活的:书里两台招牌引擎——一台查询计划器、一台 MVCC 事务模拟器——是用 JavaScript 真写出来、就在这个网页里跑的。你换个 WHERE,亲眼看 planner 从顺扫改走索引;你交错两个事务,亲眼看一行数据裂成两个版本、各自被谁看见。正文里每个成本、每个行数,都是这台引擎当场算的。

24
6
18个真引擎 Demo
2台招牌引擎:计划器 + MVCC

这本书为什么不从「什么是 SELECT」讲起

因为你已经会了。你能写多表 JOIN,用过 GROUP BY,知道加索引能变快。市面上的 SQL 入门教程对你是浪费时间。你缺的不是「SQL 语法」,是两样别的东西:

  • 把你会的那些 SQL 往深里再挖一层——为什么 NULL = NULL 不是真、GROUP BY 到底把数据切成了什么、窗口函数凭什么「不塌行」、递归查询怎么把一棵树展开。这些你天天在用,却未必说得清。
  • 认识 PostgreSQL 这个你没真正打过交道的世界——它的类型系统、它对约束的较真、它那套反直觉的 MVCC 并发、它那个会自己找最优路径的查询规划器。这些正是它和 MySQL 分道扬镳的地方。

这两样,被一根主线串起来,就是「当真」

◆ 这本书的主线

很多人把数据库当成一个「桶」——把行丢进去,需要时捞出来。MySQL 的默认脾气纵容了这种想法:你丢什么它大都收下,实在不行就悄悄改一改。方便,但你的数据里从此埋着你不知道的地雷。

PostgreSQL 把数据库当成一台「引擎」,一台对正确性较真的引擎。它认真对待你声明的每一件事:这一列是 integer 就必须是整数,这一列 NOT NULL 就绝不许空,这笔转账要么全成要么全不成,你这句查询它会认真估算十几条可能的执行路径再挑最省的。读完这本书,你会永久地改变「看数据库」这件事——它不再是个桶,而是一个你能信任、也值得信任的伙伴。

「两台引擎在浏览器里跑」是什么意思

别的数据库教程讲 EXPLAIN,是把一段执行计划印在纸上让你看;讲 MVCC,是画一张静态示意图。这本书不一样:查询计划器和 MVCC 是用 JavaScript 真写出来的,就嵌在网页里。所以每一章的 Demo 都不是动画:

  • 计划器那章,你把 WHERE customer_id = 42 改成 > 42,它当场重新估算成本,从 Index Scan 翻脸改用 Seq Scan——因为命中的行太多了,用索引反而更贵,而它算得出来;
  • MVCC 那章,你一步步交错两个事务,看同一行数据裂成两个版本(旧的打上 xmax、新的带上 xmin),再看每个事务的快照各自「该看见哪个版本」;
  • 三值逻辑那章,你随便给 abTRUE/FALSE/NULL,它算出真正的三值结果,顺手复现那个「NOT IN 里混进 NULL 就一行都查不到」的线上事故。

正文里出现的每一个数字(这个查询估算成本 2188、那五种 JOIN 分别是 3 / 5 / 4 / 6 / 16 行、running SUM 累加成 45→123→148→187→322),都是这些引擎当场算的,不是我写死的。

这本书假设你已经会什么

写给这样的人

  • 会写基本的 SQL:SELECT / WHERE / JOIN / GROUP BY
  • 用过 MySQL(或 MariaDB / SQLite),有真实建表、查数据的经验
  • 对 PostgreSQL 只有「听说很强」的印象,没真正上手过
  • 想把 SQL 从「会用」变成「说得清为什么」
  • 好奇 MVCC、EXPLAIN、事务隔离这些词底下到底是什么

暂时不适合

  • 完全没写过 SQL——先找一份 30 分钟的 SQL 入门再回来
  • 要的是 PostgreSQL 的完整参考手册(那是官方文档的活,这本是「讲透主干」)
  • 要的是 DBA 运维大全(复制、分区、调参、高可用只在最后点到为止)
  • 受不了「先讲清原理,再谈怎么用」这种顺序
▶ 关于「动手跑」这件事

这本书不需要你装任何东西就能读。Demo 就在网页里,引擎就是它本人。但 PostgreSQL 装起来很轻(brew install postgresql / docker run postgres / 一个免费云实例),第 2 章会带你三分钟跑起来——书里的每段 SQL 你都能在真库里亲手敲一遍,那才是最好的读法。

书里的 SQL 都以 PostgreSQL 16 / 17 为准。绝大多数也是标准 SQL,你在别处也用得上;凡是 PG 特有的地方,正文会明确标出来。

读法

顺着读。这本书是层层递进的:卷 II 把你会的 SQL 挖深(关系代数、NULL、JOIN、聚合、窗口、递归),卷 III 讲 PG 怎么「较真」地建模(类型与约束),卷 IV 讲它那套并发地基(事务与 MVCC),卷 V 讲它那个会思考的大脑(查询规划器),卷 VI 落到生产与迁移。后面的卷会用到前面的概念,跳着读会有点吃力。

每一章的最后都有一节 「对照 MySQL」:这一课里 PostgreSQL 的做法,和你熟悉的 MySQL 有什么不同、为什么不同。那是你把已有的 MySQL 直觉,稳稳搬到 PostgreSQL 上的桥。最后一章会把这些对照汇成一张完整的迁移速查表。