PostgreSQL 为什么值得学

很多团队只熟悉 MySQL,但 PostgreSQL 在复杂查询、地理空间、半结构化数据、扩展能力上明显更强,常被称为"最先进的开源关系型数据库"。它不是 MySQL 的替代品那么简单,而是一套类型更丰富、优化器更聪明、可扩展性极强的体系。

这篇不讲怎么建库建表,而是讲几个让 PostgreSQL 区别于普通关系库的进阶点:类型、索引、执行计划、并发模型与运维要点。

本文核心知识点
  • JSONB半结构化字段既能存又能索引查询。
  • 多索引B 树、GIN、GIST、BRIN 各有适用场景。
  • EXPLAIN读懂代价与实际行数定位慢查询。
  • VACUUMPostgreSQL 特有的清理与膨胀治理。
PostgreSQL 进阶配图:蓝色渐变背景中央一座三层蓝色数据库圆柱体,顶部伸出向上分叉的索引树状枝丫顶端是小圆球,柱体左右各悬浮一个蓝色半圆仪表盘方块,扁平科技插画
数据库柱体向上长出索引树,两侧仪表盘对应运维监控,正是索引加运维的意象。

丰富的数据类型与 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;