挑PostgreSQL相关的书,最容易掉进的坑是两类:一类通篇讲SQL标准,翻完还是不懂底层为什么慢;另一类堆概念,看完依然不知道怎么落地。谭峰和张文升写的《PostgreSQL实战》属于第三种路线,它把重点放在“工程现场会遇到的真实问题”上。书不厚,但章节安排很务实,从PostgreSQL的体系结构讲起,到索引设计、执行计划分析、事务与锁、备份恢复,再到流复制和逻辑复制,整条线基本覆盖了生产环境里最常打交道的模块。

这本书适合已经会写基本SQL、有半年以上PostgreSQL使用经验的人。如果你完全没接触过数据库,直接读可能会觉得第一章里的WAL、checkpoint、MVCC等概念比较密集。但如果是正在做后端开发、运维或者数据架构相关工作,出现慢查询不知道从哪下手,或者对索引建了一堆却依然走全表扫描感到困惑,那么书里的排查思路会带来比较直接的帮助。它的叙述方式偏向“问题出现的原因是什么,怎么验证,怎么解决”,而不是单纯罗列语法。
书中最有价值的几个技术章节
第三章关于索引的部分写得很接地气。PostgreSQL的B-tree索引、Hash索引、GIN和GiST索引分别适合什么场景,书里都有对比说明。作者不停留在理论,而是给出建索引前后的执行计划变化,让读者理解为什么有时候建了索引优化器反而不走。比如对低基数字段建B-tree索引,优化器可能认为全表扫描成本更低;又比如复合索引的列顺序会直接影响扫描效率,前导列选择不当等于白建。还讲到了表达式索引和部分索引,这两类在实际业务里非常实用,但很多教程一笔带过。
最值得反复翻的是查询优化那部分。书中花了不少篇幅讲解EXPLAIN和EXPLAIN ANALYZE怎么读,包括cost、rows、width、actual time这些字段的含义,以及Seq Scan、Index Scan、Bitmap Index Scan、Nested Loop、Hash Join等节点分别代表什么。对于开发者来说,会看执行计划基本等于掌握了调优的大门钥匙。书中还用pg_stat_statements视图定位高频慢SQL,配合auto_explain记录执行计划,整个优化流程清晰可复制。
-- 开启pg_stat_statements扩展 CREATE EXTENSION pg_stat_statements; -- 查询总执行时间最长的前5条SQL SELECT query, calls, total_exec_time, mean_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5; -- 使用EXPLAIN ANALYZE查看实际扫描方式 EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 10086 ORDER BY created_at DESC;
这段代码几乎没有花哨技巧,但作者就是通过这类简单可验证的示例,把性能分析的方法讲透了。书中反复强调一点:先定位问题再去优化,不要凭感觉加配置、改参数。这个思路对很多习惯“先改个连接池大小试试”的人很有纠偏价值。
事务、锁与MVCC的讲法比想象中透彻
PostgreSQL的MVCC机制和MySQL有明显差异,这也是不少转过来的开发者最先感到别扭的地方。书中没有把MVCC讲成玄学,而是从元组头的xmin、xmax、cmin、cmax字段入手,说明一行数据的多个版本是如何通过系统列管理的。理解这些之后,再看VACUUM为什么必须跑、为什么长事务会导致表膨胀、为什么有些查询明明没锁数据却会被阻塞,思路就顺了很多。
锁的章节也有实用价值。PostgreSQL的锁粒度分得很细,ACCESS SHARE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、ACCESS EXCLUSIVE,整整八级。很多阻塞问题都源于对锁模式不熟悉,比如ALTER TABLE需要ACCESS EXCLUSIVE锁,如果前面有长事务持有ACCESS SHARE锁,DDL就会一直等。作者通过模拟两个会话的操作来演示阻塞现象,然后教读者查pg_locks和pg_stat_activity定位阻塞源,这是平时处理线上故障很常用的方式。
-- 查看当前锁等待关系
SELECT blocked.pid AS blocked_pid,
blocked.query AS blocked_query,
blocking.pid AS blocking_pid,
blocking.query AS blocking_query
FROM pg_stat_activity blocked
JOIN pg_locks blocked_locks ON blocked.pid = blocked_locks.pid
JOIN pg_locks blocking_locks ON blocked_locks.lock_type = blocking_locks.lock_type
AND blocked_locks.database_oid = blocking_locks.database_oid
AND blocked_locks.relation_oid = blocking_locks.relation_oid
AND blocked_locks.page_oid = blocking_locks.page_oid
AND blocked_locks.tuple_oid = blocking_locks.tuple_oid
AND blocked_locks.virtualxid = blocking_locks.virtualxid
AND blocked_locks.transactionid = blocking_locks.transactionid
AND blocked_locks.classid = blocking_locks.classid
AND blocked_locks.objid = blocking_locks.objid
AND blocked_locks.objsubid = blocking_locks.objsubid
AND blocked_locks.pid != blocking_locks.pid
JOIN pg_stat_activity blocking ON blocking.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
这类SQL片段配合文中的场景说明,读者可以快速改造成自己的监控脚本。虽然锁等待的SQL查询逻辑上带有版本差异,但核心思想是通用的:先找到等锁的会话,再反查是谁持有锁,最后决定是取消等待方还是终止阻塞方。
备份恢复与高可用方案的现实偏差
备份恢复章节的最大优点是没把pg_dump当作万能方案。作者明确区分了逻辑备份和物理备份的适用边界:pg_dump适合小库、部分表迁移、跨大版本升级的数据迁移;大数据量场景必须以pg_basebackup加WAL归档为主。书中给出了一个简单的基于pg_basebackup的备份脚本示例,并解释了PITR(时间点恢复)的基本原理。读者可以把恢复流程拆解为:备份文件恢复、归档日志回放、recovery_target设置,整个思路非常清晰。
不过这里也要客观说一句,这本书出版时间决定了它的流复制部分主要围绕早期版本展开。现在的PostgreSQL在复制层已经有了更多选项,比如同步复制、级联复制、逻辑复制的应用场景和边界都有新的变化,部分参数名也有调整。读的时候建议把书中的配置项和当前所用版本对照一下,不要直接照搬。另外,高可用章节提到的方案相对基础,真正的生产高可用还需要结合Patroni、keepalived或云厂商托管能力来做,书里更多是铺垫思路,不是一个完整的HA方案。
# 使用pg_basebackup创建基础备份 pg_basebackup -h 127.0.0.1 -U replicator -D /data/pg_backup/base -Ft -z -P # 恢复时修改recovery.conf(旧版本)或postgresql.auto.conf(新版本) restore_command = 'cp /data/pg_archive/%f %p' recovery_target_time = '2024-06-15 10:30:00'
作者在书中反复提到PostgreSQL版本差异对配置项的影响,这一点对实际工作很有帮助。不同大版本之间recovery.conf是否使用、wal_level的取值、max_wal_senders的默认值都发生过变化,如果不注意版本直接复制粘贴配置,轻则启动失败,重则数据恢复错乱。读这类章节的时候,保持查阅官方文档的习惯,会让学习效果比只看书更扎实。
这本书适合怎样配合实践阅读
《PostgreSQL实战》的定位是“进阶读物”,不是入门教材。如果你刚开始学数据库,建议先熟悉基本的DDL、DML和简单查询,再来读这本书,吸收效率会高很多。读的时候最好在本地准备一个测试实例,跟着书中的示例动手执行,尤其是索引优化和锁等待部分,只有自己模拟出阻塞现场,才能真正体会到锁模式之间的冲突关系。
实际工作中,很多看似棘手的问题其实都源于对底层机制理解不够。比如有人发现VACUUM跑得越来越慢,其实是因为autovacuum参数配置不合理;有人以为加了索引查询就一定会快,实地一看优化器因为统计信息过期而误判了成本。这些问题在书里都有对应的分析框架。与其在网上碎片化地搜索解决方案,不如用这本书的章节把知识串成一条线。结合官方文档和实际项目中的慢日志,边读边排查,是最推荐的使用方式。
PostgreSQL书籍推荐PostgreSQL实战数据库性能优化修改时间:2026-09-27 13:23:00