PostgreSQL介绍
前言
养活国内大半资源数据库团队的PostgreSQL是什么,架构是怎么样的?有MySQL,为什么还要有PostgreSQL? 你是一个进程员,你维护了一个电商网站,网站后台需要存储千万级商品数据,你会选择使用什么存储这些商品数据?当然是MySQL,毕竟没有人比你更懂什么是MySQL。 但随着业务发展,产品经理提了各种需求。 比如,离用户最近的商品门店是哪个?MySQL对地理计算支持很弱,所以你选了Redis的Geohash。 又比如,要支持搜索商品,MySQL的全文搜索功能太弱,所以你又引入了Elasticsearch,也就是ES。 再比如,要做跨平台商品比价,不同电商平台的数据字段各不相同,MySQL比较结构太死板,于是你将它们组织成Jason文档,引入了更灵活的MongoDB来读写数据。 原本简单的单体架构就变成了MySQL加MongoDB加Redis加ES的复杂分布式系统。 每个中间件都要运维监控,本来就因为头发太少,每一根都有它的名字,再学下去,头发也跟着大把掉。有没有一个数据库能原生支持这些复杂需求?好办,没有什么是加一层中间层不能解决的,如果有,那就再加一层。而有这样一款数据库,能原生支持这些复杂需求,甚至被称为 “养活国内大半自研数据库团队” 的全能选手,它就是 PostgreSQL(简称 PG)。
一、PostgreSQL 是什么?—— 不止是关系型数据库
什么是PostgreSQL? PostgreSQL,简称PG,跟MySQL一样,是个用select、update这些SQL语句读写数据的关系型数据库,但在功能和扩展性方面,可以将MySQL按在地上反复摩擦。说是数据库天花板也不过分,它的能力早已超越传统关系型数据库的边界:
- 核心定位:功能全面的 “全能数据库”,支持关系型数据、JSON 文档、地理位置、数组等多种数据类型,SQL 查询能力强大,还具备极高的扩展性。
- 行业价值:国内众多自研数据库团队的底层基础,模块化设计让企业可按需定制功能,无需重复造轮子,因此被调侃 “养活国内大半自研数据库团队”。
- 核心优势:完全开源可商用,稳定性强、数据一致性有保障,既能替代 MySQL 作为基础存储,也能在部分场景下平替 MongoDB、ES、InfluxDB 等中间件,简化系统架构。
二、核心技术概念拆解 —— 搞懂 PG 底层逻辑
要理解 PG 的强大,首先得吃透它的核心技术概念,这些是支撑其高性能、高可靠性的基石:
1. 数据页:数据存储的基本单位
PG 会将数据表以 “堆表文件” 的形式存储在磁盘上(文件以数字命名,对应数据表的 RelFileNode ID)。为了避免大文件读写效率低下,PG 把数据拆分成一个个 8KB 大小的数据页—— 读写数据时,只需操作相关的数据页,而非整个文件,大幅提升效率。
2. B-Link 树:优化查询的索引神器
数据页再多,没有高效索引也会变成 “大海捞针”。PG 采用 B-Link 树 作为核心索引结构,它是 B+ 树的改进版:
- 底层叶子节点记录数据行的地址,指向堆表中的实际数据;
- 非叶子节点之间增加了右指针,页分裂时无需返回父节点,可直接跳转到右节点查询,性能更优。
- 除了 B-Link 树,PG 还支持多种索引类型,这也是它能平替 ES 等搜索中间件的关键。
3. 进程架构:稳定高效的 “多进程模式”
PG 采用 “主进程 + 多后端进程 + 后台进程” 的架构,确保稳定性和并发处理能力:
Postmaster(主进程):数据库的 “总指挥”,负责监听客户端连接、Fork 新的后端进程,以及监控所有进程的健康状态。
后端进程(Postgres):每个客户端连接对应一个独立的后端进程,专门处理 SQL 请求,进程间完全隔离 —— 就算某个进程崩溃,也不会影响其他连接,稳定性拉满。
后台进程
:默默干活的 “工具人”,包括:
- Check Pointer:定期将共享内存中的脏页(修改后未写入磁盘的数据)刷入磁盘;
- Background Writer:异步写入脏页,减轻 Check Pointer 的 IO 压力;
- WAL Writer:负责将 WAL 缓冲区的日志写入磁盘。
4. 共享内存:提升并发读写效率
如果每个后端进程都单独缓存数据页,会造成内存浪费且数据不一致。PG 设计了 共享内存区域,其中的 “共享缓冲区” 专门缓存数据页和索引页:
- 后端进程查询数据时,先查共享缓冲区,命中则直接返回;
- 未命中再从磁盘读取数据页,加载到共享缓冲区后再返回,大幅减少磁盘 IO。
5. WAL 日志机制:数据一致性的 “守护神”
共享内存中的数据还没写入磁盘时,数据库崩溃怎么办?PG 靠 WAL(Write-Ahead Logging,预写日志) 机制解决:
- 所有数据更新操作,会先写入 WAL 缓冲区,再修改共享内存中的数据页;
- 事务提交时,WAL 缓冲区的日志会被刷入磁盘;
- 数据库崩溃重启后,可通过 WAL 日志 “重做” 未持久化的操作,确保数据不丢失。
- 关键优势:WAL 日志是顺序写入,而数据页是随机写入,顺序写的性能是随机写的几十倍,兼顾效率与可靠性。
6. 数据访问层(Access Methods):连接底层与上层的桥梁
后端进程不直接操作磁盘或共享内存,而是通过 数据访问层 调用接口:
- Buffer Manager:对接共享内存,管理数据页缓存;
- Storage Manager:对接磁盘,负责数据页的读写;
- 对外提供增删改查的标准化接口,供上层模块调用。
7. 模块化扩展:无限可能的 “插件生态”
PG 的核心模块(优化器、执行器、数据访问层)都设计为开放接口,支持通过插件扩展功能:
- 支持矢量搜索、图数据库、JSON 增强等多种定制化需求;
- 社区有大量成熟插件,几乎能满足所有业务场景,这也是它成为自研数据库底层基础的核心原因。
三、PostgreSQL 查询与更新流程 —— 完整链路拆解
搞懂了核心概念,再看 PG 如何处理 SQL 请求,整个流程就清晰了:
1. 连接建立
应用通过网络连接到 Postmaster 主进程,主进程 Fork 一个专属的后端进程,后续所有 SQL 操作都通过这个后端进程处理。
2. SQL 处理
- 解析器:检查 SQL 语法正确性,生成语法树;
- 优化器:根据索引情况、数据分布,选择最优执行计划(比如是否使用 B-Link 树索引);
- 执行器:按照执行计划,调用数据访问层(Access Methods)的接口函数。
3. 数据读写
查询操作(SELECT)
:
- 执行器通过 Buffer Manager 检查共享缓冲区,是否存在目标数据页;
- 存在则直接返回数据;不存在则通过 Storage Manager 从磁盘读取数据页,加载到共享缓冲区后返回。
更新操作(UPDATE/INSERT/DELETE)
:
- 先通过数据访问层找到目标数据页(共享缓冲区没有则从磁盘加载);
- 将操作记录写入 WAL 缓冲区;
- 修改共享缓冲区中的数据页(生成脏页);
- 事务提交时,WAL Writer 将 WAL 日志刷入磁盘;
- 脏页由 Background Writer 异步刷入磁盘,或 Check Pointer 定期刷入。
4. 结果返回
执行器将处理结果返回给应用,完成一次 SQL 交互。
四、有 MySQL 了,为什么还要用 PostgreSQL?
这是很多开发者的疑问,核心答案在于 “全能性” 和 “扩展性”:
- 功能覆盖更广:MySQL 对 JSON、地理计算、全文搜索的支持较弱,而 PG 原生支持这些功能,无需引入 Redis、ES、MongoDB 等中间件,简化架构;
- 扩展性更强:PG 的模块化设计支持二次开发,国内大厂(如阿里、腾讯)的自研数据库大多基于 PG 定制,而 MySQL 定制化难度较高;
- 数据一致性更优:WAL 机制、多进程架构让 PG 在高并发场景下的数据一致性更有保障,适合金融、电商等核心业务;
- 开源生态成熟:完全开源可商用,社区活跃,插件丰富,无商业绑定风险。
当然,MySQL 也有优势(比如轻量、部署简单、读写性能在简单场景下更优),但如果你的业务需要复杂数据类型、多场景支持,或未来有定制化需求,PG 无疑是更长远的选择。
五、总结
PostgreSQL 能成为 “数据库天花板”,核心在于它的 架构设计(多进程 + 共享内存)、可靠机制(WAL 日志)、高效索引(B-Link 树)和无限扩展能力。它不仅能替代 MySQL 作为基础存储,还能减少中间件依赖,让系统架构更简洁,这也是它能支撑国内大半自研数据库团队的根本原因。
如果你正在做数据库选型,或想深入理解数据库底层原理,PG 绝对值得深入学习 —— 它的设计思想,能让你对 “高性能、高可靠、高扩展” 的数据库有全新认知。
参考资料
https://www.bilibili.com/video/BV1CkCQBoEyp
PostgreSQL:文档:18:PostgreSQL 18.0 文档 - PostgreSQL 数据库
