PostgreSQL 为什么值得学
很多团队只熟悉 MySQL,但 PostgreSQL 在复杂查询、地理空间、半结构化数据、扩展能力上明显更强,常被称为"最先进的开源关系型数据库"。它不是 MySQL 的替代品那么简单,而是一套类型更丰富、优化器更聪明、可扩展性极强的体系。
这篇不讲怎么建库建表,而是讲几个让 PostgreSQL 区别于普通关系库的进阶点:类型、索引、执行计划、并发模型与运维要点。
- JSONB半结构化字段既能存又能索引查询。
- 多索引B 树、GIN、GIST、BRIN 各有适用场景。
- EXPLAIN读懂代价与实际行数定位慢查询。
- VACUUMPostgreSQL 特有的清理与膨胀治理。
丰富的数据类型与 JSONB
PostgreSQL 自带很多 MySQL 没有的类型:数组、范围类型、几何类型、IP 类型,以及最实用的 JSONB。JSONB 把 JSON 解析成二进制存储,既保留了灵活结构,又能对内部字段建索引、用条件查询,不用再为了灵活字段搞出一堆 EAV 表。
CREATE TABLE cfg (id int, ext jsonb);
-- 对 JSONB 内部字段建 GIN 索引
CREATE INDEX idx_cfg_ext ON cfg USING GIN (ext);
SELECT * FROM cfg WHERE ext @> '{"env":"prod"}';
多种索引:B 树之外还有什么
MySQL 基本只有 B+ 树,PostgreSQL 则提供一整套索引家族:B 树用于等值与范围;GIN适合 JSONB、数组、全文检索这类多值数据;GIST适合地理空间、邻近查询;BRIN适合超大表、有序列,体积极小。选对索引类型,往往比单纯加索引更能解决问题。
读懂 EXPLAIN 执行计划
PostgreSQL 的 EXPLAIN ANALYZE 会真正执行语句并打印每一步的实际行数、耗时与代价。重点看:是不是顺序扫描了大表(该上索引)、预估行数和实际行数差得离谱(统计信息过期要 ANALYZE)、有没有嵌套循环放大。读懂计划,才能对症下药。
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42;
MVCC 与并发的特点
PostgreSQL 用 MVCC 实现"读不阻塞写、写不阻塞读",每个旧版本都保留在数据行里。好处是并发好、一致性快照强;副作用是删除、更新不会立刻释放空间,死元组会越积越多。这正是下一节 VACUUM 要处理的问题。
日常运维:VACUUM 与扩参数
因为 MVCC 保留旧版本,PostgreSQL 需要定期 VACUUM(或自动 autovacuum)回收死元组,否则表和索引会膨胀、查询变慢。运维要点:开启并调优 autovacuum、定期 ANALYZE 更新统计信息、按内存调大 work_mem 与 shared_buffers,避免用默认小参数硬扛生产负载。
和 MySQL 怎么取舍
- 团队熟、生态成熟、读写简单 → MySQL 依然顺手。
- 复杂查询、JSONB、地理空间、强一致性需求 → PostgreSQL 更优。
- 同一系统混用两者完全可行,按业务选最合适的。
落地清单
- 灵活字段优先用 JSONB 并配 GIN 索引。
- 按查询特征选索引类型,别只靠 B 树。
- 慢查询先 EXPLAIN ANALYZE 看计划再优化。
- 管好 autovacuum 与统计信息,防表膨胀。
- 按实际内存调整核心参数,别用默认值上线。