PostgreSQL 核心概念
内容:从架构 -> 存储 -> 事务 -> 查询 -> 索引 -> 并发 -> 运维
PostgreSQL 是一个:
- 关系型数据库(RDBMS)
- 强一致性(ACID)
- 多进程架构
- MVCC(多版本并发控制)
- 可扩展(Extension)
- OLTP 为主,OLAP 可辅
👉 核心设计哲学:
“正确性 > 性能 > 便利性”
Client
↓
Postmaster(监听进程)
↓ fork
Backend Process(每个连接一个进程)
特点
- 一个连接 = 一个进程
- 无共享内存线程模型(对比 MySQL InnoDB)
- 稳定、隔离性强
- 连接数不能无限大 -> PgBouncer
| 进程 | 作用 |
|---|---|
| postmaster | 主进程 |
| backend | 处理客户端请求 |
| checkpointer | 定期刷脏页 |
| bgwriter | 后台写 |
| walwriter | WAL 写入 |
| autovacuum | 回收垃圾 |
| archiver | WAL 归档 |
| logical replication | 逻辑复制 |
Page(页)
- 默认 8KB
- 最小 IO 单位
- 所有数据都在 Page 里
Page 结构
Page Header
Line Pointer
Tuple(行数据)
- PostgreSQL 是 行存储
- 一行更新 ≠ 原地更新
👉 UPDATE 本质 = INSERT + DELETE
当字段很大时:
- TEXT
- JSON
- BYTEA
会被自动拆分存储到 TOAST 表。
多版本并发控制
每一行都有:
xmin:创建该行的事务ID
xmax:删除该行的事务ID
核心思想
- 读不阻塞写
- 写不阻塞读
一行是否可见取决于:
- 当前事务 ID
- 行的 xmin / xmax
- 当前事务快照(Snapshot)
- 阻止 VACUUM
- 导致表膨胀
- 复制延迟
| 特性 | PostgreSQL 实现 |
|---|---|
| Atomicity | WAL |
| Consistency | 约束 + 事务 |
| Isolation | MVCC |
| Durability | WAL + fsync |
PostgreSQL 支持:
| 隔离级别 | 实现 |
|---|---|
| READ COMMITTED | 默认 |
| REPEATABLE READ | 快照 |
| SERIALIZABLE | SSI |
⚠️ PostgreSQL 没有真正的 READ UNCOMMITTED
所有修改,先写日志,再写数据
顺序
WAL -> Memory
WAL -> Disk
Data Page -> Disk(延迟)
- 崩溃恢复
- 主从复制
- PITR
- 逻辑复制
- 将脏页刷盘
- 控制 WAL 增长
- 太频繁 -> IO 抖动
- 太少 -> 恢复慢
| 索引 | 适用 |
|---|---|
| B-Tree | =, <, >, BETWEEN |
| GIN | array / json / trgm |
| GiST | 空间 / 模糊 |
| BRIN | 超大表,顺序数据 |
| Hash | 等值(很少用) |
- 索引也是表
- 索引有 MVCC
- UPDATE 会导致索引膨胀
(a, b, c)
可用:
- a
- a, b
- a, b, c
不可用:
- b
- c
SQL
↓
Parser(语法)
↓
Rewriter(规则重写)
↓
Planner(成本估算)
↓
Executor(执行)
Planner 决策依据
- 统计信息
- 表大小
- 索引选择性
- I/O 成本
统计信息来源
ANALYZE;
pg_statistic;
| 类型 | 说明 |
|---|---|
| 表级锁 | DDL |
| 行级锁 | UPDATE |
| Advisory Lock | 应用锁 |
| Predicate Lock | SERIALIZABLE |
- 行锁是 逻辑锁
- 锁与 MVCC 并存
- SELECT 默认不加锁
- MVCC 产生垃圾
- 回收 dead tuple
- 更新统计信息
- 自动运行
- 不等于万无一失
- 高写入场景必须调优
TIMESTAMP vs TIMESTAMPTZ
| 类型 | 含义 |
|---|---|
| TIMESTAMP | 无时区 |
| TIMESTAMPTZ | 绝对时间 |
👉 日志 / 事件 / 审计:必须 TIMESTAMPTZ
常见扩展
| 扩展 | 作用 |
|---|---|
| pg_trgm | 模糊搜索 |
| uuid-ossp | UUID |
| hstore | KV |
| PostGIS | GIS |
| TimescaleDB | 时序 |
| 维度 | PostgreSQL | MySQL |
|---|---|---|
| 架构 | 多进程 | 多线程 |
| MVCC | 更完整 | InnoDB |
| SQL 标准 | 高 | 一般 |
| 扩展 | 极强 | 较弱 |
| OLAP | 更适合 | 偏 OLTP |
PostgreSQL 是一个以 MVCC + WAL 为核心、以正确性为第一优先级、通过 VACUUM 自我修复的关系型数据库。