01 - 简介:PostgreSQL 的前世今生
第 01 章 · PostgreSQL 简介
1.1 历史沿革
PostgreSQL 的历史可追溯至 1973 年加州大学伯克利分校(UC Berkeley)的 Ingres 项目,由 Michael Stonebraker 教授领导。
1973 ── Ingres 项目启动(UC Berkeley)
│
1982 ── 商业化:Ingres Corporation
│
1986 ── POSTGRES 项目启动(Stonebraker 回归学术界)
│
1995 ── Postgres95 — 添加 SQL 支持
│
1996 ── PostgreSQL 6.0 — 开源并更名为 PostgreSQL
│
2000 ── 7.0 — 外键、JOIN 改进
│
2005 ── 8.0 — Windows 原生支持、Savepoints、Point-in-Time Recovery
│
2010 ── 9.0 — 流复制、Hot Standby
│
2014 ── 9.4 — JSONB 类型、逻辑复制
│
2017 ── 10 ── 逻辑复制内置、分区表声明式语法
│
2021 ── 14 ── 多范围类型、压缩 TOAST
│
2023 ── 16 ── MERGE 命令、逻辑复制增强
│
2024 ── 17 ── 增量备份、JSON_TABLE、SQL/JSON 改进
│
2025 ── 18(开发中)— 持续创新中
📌 为什么叫 PostgreSQL 而不是 Postgres? 因为它继承自 POSTGRES 项目,又增加了 SQL 支持,所以合称 PostgreSQL。但社区中很多人仍亲切地叫它 “Postgres”。
1.2 核心特性一览
| 特性类别 | 具体特性 | 说明 |
|---|---|---|
| 数据完整性 | ACID 事务 | 完整的事务支持 |
| 数据类型 | 丰富类型系统 | JSON/JSONB、数组、Range、几何、网络地址、全文搜索等 |
| 索引 | 多种索引类型 | B-Tree、Hash、GiST、GIN、BRIN、Bloom |
| 并发控制 | MVCC | 多版本并发控制,读写互不阻塞 |
| 复制 | 流复制 + 逻辑复制 | 物理级和逻辑级的高可用方案 |
| 扩展性 | 扩展体系 | 400+ 官方及社区扩展 |
| 安全性 | 行级安全策略(RLS) | 精细的访问控制 |
| 过程语言 | PL/pgSQL、PL/Python 等 | 支持多种语言编写存储过程 |
| 全文搜索 | tsvector / tsquery | 内建全文搜索引擎 |
| 分区 | 声明式分区表 | Range / List / Hash 分区 |
| JSON | 原生 JSON/JSONB | 可作为文档数据库使用 |
1.3 PostgreSQL vs MySQL
这是最常被问到的问题。以下是客观对比:
| 维度 | PostgreSQL | MySQL (InnoDB) |
|---|---|---|
| 许可证 | PostgreSQL License(类 MIT) | GPL v2 / 商业许可(Oracle) |
| SQL 标准合规 | ⭐⭐⭐⭐⭐ 高度合规 | ⭐⭐⭐ 部分合规 |
| JSON 支持 | JSONB 索引强大,可当文档库 | JSON 类型支持有限 |
| 全文搜索 | 内建 tsvector/tsquery | 需要 FULLTEXT 索引(功能较弱) |
| 地理数据 | PostGIS 扩展(行业标准) | 空间扩展(功能较少) |
| 并发模型 | MVCC,读写互不阻塞 | InnoDB MVCC,但部分场景仍有锁争用 |
| 复制 | 流复制 + 逻辑复制 | 主从复制、Group Replication |
| 扩展性 | 扩展机制极其强大(类型、索引、函数均可扩展) | 扩展机制有限 |
| 默认端口 | 5432 | 3306 |
| 典型用户 | Apple、Spotify、Instagram、Reddit | Facebook、GitHub、WordPress |
| 适用场景 | 复杂查询、GIS、JSON 文档、OLAP | 简单 CRUD、Web 应用、读密集场景 |
选型建议
需要复杂查询/分析? ──→ PostgreSQL
需要 GIS 地理数据? ──→ PostgreSQL + PostGIS
需要 JSON 文档存储? ──→ PostgreSQL (JSONB)
需要简单 Web 后端? ──→ MySQL 或 PostgreSQL 都可以
需要最高生态兼容? ──→ MySQL(CMS 生态更成熟)
💡 技巧:近年来 PostgreSQL 在各领域的采用率持续增长。如果你不确定选哪个,选 PostgreSQL 通常不会错——它的功能是 MySQL 的超集。
1.4 适用场景
✅ 非常适合的场景
| 场景 | 为什么选 PG |
|---|---|
| 企业级 OLTP | 事务可靠性强,ACID 完整 |
| 地理信息系统(GIS) | PostGIS 是行业标准 |
| JSON 文档存储 | JSONB 类型 + GIN 索引,媲美 MongoDB |
| 时序数据 | TimescaleDB 基于 PG,性能优异 |
| 全文搜索 | 内建 tsvector,pg_trgm 模糊搜索 |
| 数据仓库/OLAP | 窗口函数、CTE、并行查询 |
| 多租户 SaaS | RLS + Schema 隔离 |
| 科学计算 | 数组类型 + PL/Python + 扩展生态 |
⚠️ 不太适合的场景
| 场景 | 原因 | 替代方案 |
|---|---|---|
| 超高写入吞吐(百万 TPS) | MVCC 开销较大 | ScyllaDB、TiKV |
| 纯键值存储 | 过于重量级 | Redis、etcd |
| 图数据库 | 非原生图模型 | Neo4j、Apache AGE(PG 扩展) |
| 嵌入式数据库 | 资源占用较高 | SQLite |
1.5 版本选择建议
截至 2026 年,PostgreSQL 各版本的支持状态如下:
| 版本系列 | 发布时间 | EOL(预计) | 状态 | 建议 |
|---|---|---|---|---|
| PG 14 | 2021-09 | 2026-11 | 安全维护期 | 计划升级 |
| PG 15 | 2022-10 | 2027-11 | 安全维护期 | 可用 |
| PG 16 | 2023-09 | 2028-11 | 活跃维护 | ✅ 推荐 |
| PG 17 | 2024-09 | 2029-11 | 活跃维护 | ✅ 推荐(最新稳定版) |
| PG 18 | 开发中 | — | 开发版 | 不用于生产 |
⚠️ 注意事项:
- PostgreSQL 每年发布一个大版本,每年 9 月/10 月发布
- 每个大版本维护 5 年
- 升级大版本需要
pg_upgrade或逻辑迁移 - 生产环境建议选择最新的稳定版本
1.6 社区与生态
核心资源
| 资源 | 地址 |
|---|---|
| 官方文档 | https://www.postgresql.org/docs/ |
| Wiki | https://wiki.postgresql.org/ |
| 邮件列表 | pgsql-general / pgsql-novice |
| GitHub Mirror | https://github.com/postgres/postgres |
| PG Extensions | https://pgxn.org/ |
| PGXN(扩展网络) | https://pgxn.org/ |
知名发行版
| 发行版 | 说明 |
|---|---|
| 官方原版 | postgresql.org 下载 |
| Citus | 分布式 PG(微软) |
| Greenplum | MPP 数据仓库(基于 PG) |
| TimescaleDB | 时序数据库扩展 |
| Supabase | 开源 Firebase 替代(基于 PG) |
| Neon | Serverless PostgreSQL |
| YugabyteDB | 分布式 SQL(PG 兼容) |
1.7 快速体验
如果你想现在就试一试,最快的方式是用 Docker:
# 拉取并启动 PostgreSQL 17
docker run -d \
--name pg-demo \
-e POSTGRES_PASSWORD=mypassword \
-p 5432:5432 \
postgres:17
# 连接数据库
docker exec -it pg-demo psql -U postgres
# 在 psql 中执行
SELECT version();
SELECT current_database();
SELECT now();
输出示例:
version
-------------------------------------------------------------------------------------------------------------
PostgreSQL 17.x on x86_64-pc-linux-gnu, compiled by gcc (GCC) x.x.x, 64-bit
(1 row)
业务场景
| 场景 | PG 如何发挥作用 |
|---|---|
| 电商系统 | 订单事务(ACID)+ 商品搜索(全文索引)+ 地址解析(PostGIS) |
| 社交平台 | 用户关系 + JSONB 存储动态内容 + 推送通知(LISTEN/NOTIFY) |
| 数据分析平台 | 窗口函数 + CTE + 并行查询 + 分区表 |
| IoT 平台 | 时序数据(TimescaleDB)+ JSONB 存储设备元数据 |
| SaaS 多租户 | Schema 级隔离 + RLS 行级安全 |