中间件速查手册
关系型数据库 · postgresql

PostgreSQL

功能最全的开源关系库,SQL 标准与扩展最强

关系型数据库PostgreSQL License(类 BSD)C学习难度:中等

PostgreSQL 常被叫作“开源 Oracle”:SQL 标准支持最完整,JSONB、数组、全文检索、GIS、向量检索都能开箱用,还能装扩展改内核行为。它的 MVCC 不用 UNDO,靠行上的版本信息和 VACUUM 回收,所以表会“膨胀”——这是用 PG 必须理解的第一件事。

01

它解决什么问题

MySQL 在复杂查询、JSON 处理、地理数据、窗口函数上越来越吃力;业务又不想上商业库,需要一个功能更全、许可更宽松的开源选择。

真实场景:典型场景:SaaS 产品用 PG 存业务数据,同时用 JSONB 存自定义字段、用 PostGIS 算门店距离、用 pgvector 做语义检索,一个库全搞定。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

一次 UPDATE 在 PostgreSQL 里发生了什么

客户端libpq / JDBCpostmaster主进程Backend每连接一个进程Shared Buffers共享内存页缓存WALpg_wal / 归档Autovacuum回收死元组

← 左右滑动查看完整流程图 →

01 / 05
1. 建立连接

客户端连到 5432,postmaster 收到后 fork 一个 backend 进程专门服务这条连接。

提示:关键差异:PG 不原地改行,而是写一个新版本,旧版本靠 VACUUM 回收。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • SQL 标准和高级特性最完整:窗口函数、CTE、JSONB、数组、范围类型
  • 扩展生态强:PostGIS、pgvector、TimescaleDB、Citus 都能直接装
  • 并发控制更细,DDL 大多不锁表(CREATE INDEX CONCURRENTLY)
  • 许可宽松(类 BSD),商业化没有法律风险
  • 流复制、逻辑复制、PITR 都很成熟
不适合什么
  • 更新是写新版本,表和索引容易膨胀,必须管好 VACUUM
  • 每连接一个进程,高并发短连接场景需要连接池(pgbouncer)
  • 默认参数偏保守,不做调优性能发挥不出来
  • 国内运维人才和现成方案比 MySQL 少一些
05

常见使用场景

每个场景都配一句「为什么用它」。

01

SaaS 与复杂业务系统

多租户业务表、自定义字段(JSONB)、复杂报表查询。

为什么用它:表达力强,一个库能覆盖关系、文档、检索多种需求。

02

地理与位置服务

PostGIS 算距离、找范围内门店、做路径规划。

为什么用它:空间索引和空间函数是内建扩展,别的库要额外组件。

03

AI 应用的向量存储

pgvector 存 embedding,做相似度检索,和业务表放一起。

为什么用它:不用再引一套向量数据库,事务和 join 都还在。

06

同类对比

和同赛道的组件并排看,差异一目了然。

MySQLPostgreSQLOracle

选型顺序应该是:先看是不是单机嵌入式(是就 SQLite),再看预算和合规(要商业兜底就 Oracle),最后在 MySQL 和 PostgreSQL 之间按“功能复杂度 vs 生态成熟度”取舍。三者都能存好数据,差别在边界。

打开对比页
07

常见问题

上手第一个月最容易卡住的地方。

Q1PostgreSQL 和 MySQL 怎么选?

要复杂查询、JSON、GIS、向量检索、严格 SQL 标准,选 PG;要极简运维、海量读、成熟分库分表方案和大量现成人才,选 MySQL。新项目如果团队没有强偏好,PG 的功能上限更高;已有 MySQL 体系且跑得好,没必要迁。

Q2表膨胀是怎么回事?

PG 的 UPDATE 不是原地改,而是写一条新记录、把旧的标记为死元组。死元组不清理就一直占着页空间,表和索引越来越大,扫描变慢。autovacuum 负责回收,但大批量更新、长事务会拖住它,所以要么调参数、要么定期手动 VACUUM FULL(会锁表)。

Q3为什么连接数一多就卡?

每个连接是一个操作系统进程,几百个连接就有几百个进程,上下文切换和内存开销都上来了。标准做法是前面挂 pgbouncer 做连接池,把上千个客户端连接收敛成几十个真实连接。

Q4PG 能做分库分表吗?

能,但方式不同:原生有声明式分区(按范围/列表/哈希),跨库可以用 Citus 扩展做分布式。相比 MySQL 生态的 ShardingSphere,PG 的分片方案更“库内”,运维模型不一样,选之前先评估团队熟悉度。