李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 中间件
  3. 正文

深入了解PostgreSQL

2025年11月17日 341 0 0
本文最后更新于 2025年11月17日,距今已 355 天,其中的信息可能已经发生变化,请注意甄别。

PostgreSQL简介

PostgreSQL 是一款开源企业级关系型数据库,核心定位是“功能全面、稳定可靠、高度可扩展”,兼具开源自由与商业数据库的企业级能力,被广泛用于金融、电商、政务等核心业务场景。以下从核心维度深度解析:

一、核心定位与发展背景

  • 起源:1986年源于加州大学伯克利分校的 POSTGRES 项目,1996年正式命名为 PostgreSQL,持续迭代至今(最新稳定版16.x)。
  • 定位:开源领域的“全能型数据库”,既支持传统关系型数据管理,又兼容非关系型数据(JSON、数组等),兼顾事务一致性与扩展性。
  • 生态地位:与 MySQL 并列为两大主流开源数据库,MySQL 侧重轻量、高并发读写,PostgreSQL 侧重复杂查询、数据完整性与多模支持。

二、核心特性(差异化优势)

1. 事务与数据一致性

  • 严格遵循 ACID 原则,支持多版本并发控制(MVCC),实现“无锁读”——读操作不阻塞写操作,写操作不阻塞读操作,提升高并发场景下的性能。
  • 支持 Serializable 隔离级别(最高隔离级别),避免幻读、不可重复读等并发问题,适合金融交易等核心场景。

2. 功能全面性

  • 数据类型丰富:除基础类型外,支持数组、JSON/JSONB(二进制JSON,高效查询)、地理空间数据(PostGIS 扩展)、枚举类型、自定义复合类型。
  • SQL 标准兼容性高:支持 SQL:2016 大部分特性,包括窗口函数、CTE(公共表表达式)、MERGE 语句、递归查询等,复杂查询能力强。
  • 扩展性极强:支持自定义函数(PL/pgSQL、Python、Java 等多语言)、存储过程、触发器、表继承、分区表(范围、列表、哈希分区)。

3. 安全与可靠性

  • 内置完善的安全机制:角色权限管理、行级安全策略(RLS)、数据加密(传输加密、存储加密)、SSL 支持,满足合规要求(如 GDPR)。
  • 数据恢复能力:支持 WAL(Write-Ahead Log,预写日志),崩溃后可通过 WAL 恢复数据,避免数据丢失;支持时间点恢复(PITR),可恢复到任意历史时刻。

4. 扩展性与性能优化

  • 水平扩展:支持读写分离、流复制(主从同步)、逻辑复制(跨版本/跨集群同步),可通过集群方案(如 Patroni、PgBouncer)实现高可用与负载均衡。
  • 性能优化:内置查询优化器(支持索引扫描、哈希连接、合并连接等多种执行计划),支持多种索引类型(B树、哈希、GiST、GIN 等),适配不同查询场景。

三、架构设计核心

1. 进程模型

  • 采用“主进程+子进程”架构:Postmaster(主进程)负责监听连接、fork 后端进程(每个客户端连接对应一个后端进程)、管理辅助进程(WAL 写入进程、检查点进程等)。
  • 优势:进程隔离,单个连接故障不影响整体数据库服务;缺点:高并发下进程切换开销较大(可通过 PgBouncer 连接池优化)。

2. 存储架构

  • 数据存储:以“表空间”为单位管理磁盘存储,表数据按“块”(默认8KB)存储,支持大对象(LOB)存储(适合存储文件、图片等)。
  • WAL 机制:所有写操作先写入 WAL 日志,再写入数据文件,确保事务持久性;WAL 还支持归档,为时间点恢复提供基础。

3. 并发控制:MVCC

  • 核心逻辑:为每个事务分配唯一事务ID,数据修改时不覆盖原数据,而是生成新版本,事务仅能看到自己可见的数据版本。
  • 优势:读写互不阻塞,并发性能优秀;缺点:会产生“死元组”(过时数据版本),需通过 VACUUM 进程清理,避免磁盘膨胀。

四、适用场景与典型案例

1. 核心适用场景

  • 企业级业务系统:金融交易、电商订单、政务数据管理(需事务一致性、数据完整性)。
  • 数据仓库与BI分析:支持复杂查询、分区表、并行查询,适合海量数据统计分析。
  • 多模数据场景:同时存储关系型数据与JSON/地理空间数据(如地图服务、物联网数据管理)。
  • 开源替代场景:替代 Oracle、SQL Server 等商业数据库,降低 licensing 成本。

2. 典型案例

  • 金融:摩根大通、花旗银行用其处理交易数据;
  • 互联网:Netflix、Uber 用其存储业务数据与分析数据;
  • 政务:美国邮政、欧盟部分政务系统采用;
  • 国内:阿里云、腾讯云等云厂商的数据库服务(如阿里云 PolarDB 兼容 PostgreSQL)。

五、优势与短板对比

优势

  • 功能全面:覆盖关系型与非关系型数据需求,无需额外集成其他数据库。
  • 稳定可靠:历经30余年迭代,核心代码成熟,极少出现重大Bug,适合核心业务。
  • 开源自由:基于 PostgreSQL 许可证,可自由使用、修改、二次分发,无商业限制。
  • 扩展性强:支持自定义功能与扩展插件(如 PostGIS 空间扩展、pg_stat_statements 性能监控插件)。

短板

  • 轻量场景适配不足:单表高并发简单读写(如秒杀场景)性能略逊于 MySQL(InnoDB 引擎)。
  • 配置复杂:参数众多(超过300个可配置参数),优化与调优门槛较高,需专业知识。
  • 生态工具丰富度:相比商业数据库(如 Oracle),第三方工具(备份、监控、迁移)的生态成熟度略低。

六、生态与工具链

1. 核心工具

  • 自带工具:psql(命令行客户端)、pg_dump/pg_restore(备份恢复工具)、pg_basebackup(基础备份工具)。
  • 第三方工具:
    • 管理工具:pgAdmin(官方GUI)、DBeaver、Navicat;
    • 连接池:PgBouncer、Pgpool-II;
    • 高可用:Patroni、Stolon;
    • 监控:Prometheus + Grafana(搭配 pg_exporter)、pg_stat_monitor。

2. 云原生支持

  • 主流云厂商均提供托管 PostgreSQL 服务(如 AWS RDS for PostgreSQL、阿里云 PolarDB-X、腾讯云 CynosDB),支持自动扩缩容、备份、高可用等开箱即用功能。
  • 支持容器化部署(Docker)与 Kubernetes 编排,适配云原生架构。

七、实践建议

  1. 版本选择:优先选择稳定版(如14.x、15.x),避免使用刚发布的新版本(如16.x需观察1-2个小版本迭代)。
  2. 性能优化:合理设计索引(避免过度索引)、配置 WAL 缓冲区(wal_buffers)、定期执行 VACUUM 清理死元组。
  3. 高可用方案:生产环境建议部署主从复制(流复制),搭配 Patroni 实现自动故障转移。
  4. 备份策略:结合基础备份(pg_basebackup)+ WAL 归档,实现时间点恢复,避免数据丢失。

设计&架构

PostgreSQL 作为开源关系型数据库的“全能选手”,其设计理念、架构实现与其他数据库存在显著差异,核心体现在“平衡功能全面性、事务可靠性与扩展灵活性”上。以下从设计内核、架构细节、与其他数据库的对比三个维度展开分析:

一、设计内核:以“关系模型为基,多模扩展为翼”

PostgreSQL 的设计从底层就围绕“强关系型+高扩展性”展开,既坚守关系模型的核心优势(数据完整性、事务一致性),又突破传统关系型数据库的功能边界。

1. 数据模型设计:关系型为骨,多模为肉

  • 核心:严格的关系模型
    基于关系代数理论,以表(Table)、行(Row)、列(Column)为基本单位,通过主键(Primary Key)、外键(Foreign Key)、约束(Constraint)维护数据间的关联与完整性(如唯一约束、check约束、非空约束),确保业务规则在数据库层落地(例如“订单表的用户ID必须关联到用户表”)。

  • 扩展:多模数据兼容
    突破传统关系型数据库对“结构化数据”的单一支持,原生支持多类型数据存储:

    • 半结构化数据:JSON/JSONB(二进制JSON,支持索引和高效查询)、XML,可直接对JSON字段进行条件查询(如 WHERE data->>'name' = 'foo');
    • 非结构化/复杂类型:数组(支持多维数组,如 int[]、text[][])、复合类型(自定义结构体,如 CREATE TYPE person AS (name text, age int))、地理空间数据(通过PostGIS扩展支持点、线、面等空间对象及空间索引);
    • 大对象(LOB):支持存储GB级文件(如图片、文档),通过 oid 类型引用,避免表数据膨胀。

    这种设计让 PostgreSQL 无需集成第三方数据库(如MongoDB存JSON、Redis存缓存),即可应对混合数据场景。

2. 事务模型设计:ACID为纲,MVCC为核

  • ACID 严格落地
    完全支持事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability):

    • 原子性:通过事务日志(WAL)确保“要么全执行,要么全回滚”;
    • 一致性:依赖约束(外键、check等)和事务隔离级别,避免中间状态暴露;
    • 隔离性:支持SQL标准的4种隔离级别(读未提交、读已提交、可重复读、Serializable),默认“读已提交”,且Serializable级别通过“快照隔离+冲突检测”实现,无幻读;
    • 持久性:所有写操作先写入WAL日志(预写日志),再异步刷入数据文件,即使崩溃也可通过WAL恢复。
  • MVCC(多版本并发控制)设计
    核心解决“读写冲突”问题,与MySQL的InnoDB、Oracle的MVCC实现有本质差异:

    • 实现逻辑:每个事务分配唯一ID(XID),数据修改时不覆盖原数据,而是生成新的版本(包含“创建XID”和“删除XID”),事务通过“可见性规则”判断哪些版本可见(例如“仅能看到创建XID小于当前事务ID,且删除XID未被提交”的版本);
    • 优势:读操作无需加锁(“无锁读”),读写互不阻塞,高并发场景下性能更稳定;
    • 差异点:
    • 与InnoDB:InnoDB的版本信息存在undo log(独立日志文件),PostgreSQL的版本信息直接存储在数据行中(每行额外占用28字节左右);
    • 与Oracle:Oracle的MVCC依赖“回滚段”,PostgreSQL无需单独回滚段,版本管理更轻量。

3. 存储模型设计:分层管理,日志优先

  • 存储分层:表空间(Tablespace)→ 数据库(Database)→ 模式(Schema)→ 表(Table)→ 数据块(Block)

    • 表空间:映射到物理磁盘目录,可将热数据和冷数据分离存储(如高频访问表放SSD,归档表放HDD);
    • 数据块:默认8KB(可配置),是读写的最小单位,每个块包含页头(元数据)、数据行、空闲空间;
    • 大表存储:支持分区表(范围分区、列表分区、哈希分区),将大表拆分为小表,提升查询效率(如按时间分区的订单表,查询近3个月数据仅扫描对应分区)。
  • WAL(预写日志)机制
    所有写操作(增删改)先写入WAL日志(顺序写入,速度快),再异步写入数据文件(随机写入,速度慢),确保:

    • 崩溃恢复:数据库重启时,通过WAL重演未刷盘的操作,避免数据丢失;
    • 主从同步:从库通过流复制同步WAL日志,实现近实时数据同步。

二、架构细节:“进程隔离+模块化”的经典设计

PostgreSQL 采用“主进程+子进程+模块化插件”的架构,兼顾稳定性与扩展性,核心组件如下:

1. 进程模型:主进程统筹,子进程隔离

  • Postmaster(主进程):数据库的“总控中心”,负责监听端口(默认5432)、接收客户端连接、fork后端进程(Backend Process)、管理辅助进程、处理数据库启停与崩溃恢复。
  • Backend Process(后端进程):每个客户端连接对应一个独立进程,负责处理SQL执行、事务管理、数据读写,进程间通过共享内存通信;优势:单个连接故障(如SQL死循环)不影响其他连接;劣势:高并发下进程切换开销大(可通过PgBouncer连接池优化)。
  • 辅助进程:
    • bgwriter(后台写入进程):异步将共享缓冲区中的脏页(修改过的数据块)刷入磁盘,减少用户进程的IO阻塞;
    • walwriter(WAL写入进程):将WAL缓冲区的数据刷入WAL文件,确保日志持久性;
    • checkpointer(检查点进程):定期触发检查点,强制刷写脏页并更新数据文件元信息,缩短崩溃恢复时间;
    • autovacuum(自动清理进程):定期清理“死元组”(被删除或更新的旧版本数据),避免磁盘膨胀和性能下降。

2. 内存架构:多级缓存,按需分配

  • 共享内存(所有进程共享):
    • 共享缓冲区(shared_buffers):缓存数据块和索引块,减少磁盘IO(建议配置为物理内存的25%);
    • WAL缓冲区(wal_buffers):缓存待写入的WAL日志,默认64KB,大事务场景可调大;
    • 锁表与进程间通信区:存储全局锁信息和进程间消息。
  • 本地内存(每个后端进程私有):
    • 工作内存(work_mem):用于排序、哈希连接等操作(如 ORDER BY、JOIN),大查询需调大;
    • 维护内存(maintenance_work_mem):用于索引创建、VACUUM等维护操作,建议单独配置。

3. 执行引擎:优化器驱动,多策略适配

  • 查询优化器:基于成本(Cost-Based Optimizer,CBO),通过分析表统计信息(行数、数据分布等),生成最优执行计划(如选择索引扫描还是全表扫描,哈希连接还是嵌套循环);支持复杂查询(如递归CTE、窗口函数)的优化。
  • 执行策略:支持并行查询(多进程协同扫描大表)、分区剪枝(跳过无关分区)、索引类型适配(B树适合范围查询,GIN适合数组/JSONB查询)。

三、与其他数据库的核心对比

PostgreSQL 的定位是“功能全面的企业级数据库”,与其他关系型、非关系型数据库的差异体现在场景适配性上:

1. 与其他关系型数据库对比

维度 PostgreSQL MySQL(InnoDB) Oracle
核心定位 开源全能型,兼顾功能与扩展性 轻量高性能,侧重简单读写场景 商业旗舰型,全栈企业级支持
SQL兼容性 支持SQL:2016大部分特性(窗口函数、MERGE等) 支持SQL:2003部分特性,自定义语法多(如LIMIT) 支持SQL:2016全特性,扩展语法丰富
数据类型 原生支持JSONB、数组、地理空间等多模类型 支持JSON但查询性能弱,无原生数组类型 支持JSON、空间数据(需扩展)
事务隔离 支持4级隔离,Serializable无幻读 支持4级隔离,默认可重复读(有幻读风险) 支持4级隔离,Serializable通过锁实现
MVCC实现 版本信息存数据行内,无需回滚段 版本信息存undo log(独立文件) 版本信息存回滚段(需手动管理)
扩展性 支持自定义函数(多语言)、表继承、插件扩展(如PostGIS) 扩展能力弱,自定义函数仅支持SQL/存储过程 支持PL/SQL、Java存储过程,扩展丰富但闭源
性能特点 复杂查询(多表关联、子查询)性能优,高并发读写略逊 单表简单读写(CRUD)性能优,锁机制轻量 全场景性能优,但资源消耗高
适用场景 复杂业务系统、数据仓库、多模数据场景 互联网高并发场景(如电商详情页、社交Feed) 金融核心系统、企业级复杂应用

2. 与非关系型数据库对比

维度 PostgreSQL MongoDB(文档数据库) Redis(键值数据库)
数据模型 关系模型为主,兼容文档/数组等多模 文档模型(JSON-like BSON),无固定 schema 键值对模型,支持字符串/哈希/列表等结构
事务支持 强事务(ACID),支持跨表事务 4.0+支持多文档事务,不支持跨集合事务 单命令原子性,5.0+支持简单事务
查询能力 支持复杂SQL(关联、分组、子查询)、JSONB索引查询 支持文档内查询,无SQL,关联查询弱 仅支持键匹配,复杂查询需客户端实现
扩展性 水平扩展依赖外部工具(如Patroni) 原生支持分片集群,扩展灵活 支持主从、集群分片,扩展简单
性能特点 磁盘存储,适合大容量、低写入延迟 磁盘存储,文档写入性能优 内存存储,读写性能极高(微秒级)
适用场景 需事务一致性+复杂查询的混合数据场景 非结构化数据(如日志、用户画像),快速迭代业务 缓存、计数器、实时排行榜等高频访问场景

总结:PostgreSQL 的“全能性”与场景适配

PostgreSQL 的设计与架构本质是“以关系模型为根基,用多模扩展打破边界,靠事务可靠性支撑核心业务”。其优势在于:

  • 比 MySQL 更适合复杂业务(多表关联、数据完整性约束)和多模数据场景;
  • 比 Oracle 更轻量、开源免费,功能接近但部署成本更低;
  • 比 MongoDB/Redis 更适合需要事务一致性和复杂查询的场景,同时避免多数据库集成的复杂性。

但它并非“银弹”:在超高频简单读写(如秒杀)场景,性能不及 MySQL;在纯非结构化数据的高并发写入场景,灵活性不及 MongoDB。因此,技术选型需结合业务核心需求——若业务需要“强事务+复杂查询+多模数据”,PostgreSQL 是最优解之一。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

深入了解PostgreSQL

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: MySQL PostgreSQL SQL 数据库
最后更新:2025年11月17日

岁月同一天 11 月 7 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月7日
    DeepSeek本地部署全攻略:从环境搭建到高级应用,打造专属 AI 助手

    DeepSeek 作为国产开源大模型的佼佼者,凭借出色的推理能力、代码生成效率和中文支持,成为很多开发者本地部署的首选。…

相关文章
  • 分布式之数据库和缓存双写一致性方案解析2019年10月30日
  • MySQL数据库之存储过程与存储函数2024年6月12日
  • 数据库更新如何实现乐观锁2025年12月26日
  • 数据库事务的隔离级别2021年6月2日
  • 使用内存数据库进行MyBatis单元测试2025年12月24日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

我思故我在。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了给服务器加了WAF游本昌去世关于主题加载速度优化的一点儿小演进
Claude Haiku 4.5、Claude Sonnet 4.6、Claude Opus 4.7 区别以及各自的新特性 零成本玩转 Gemini 3 Pro:普通人的全场景免费使用指南(2025 最新) 分布式事务的 N 种实现 Let's Encrypt宣布证书缩短至64天,手动时代彻底终结! Spring Boot 指定外部配置文件的方式 余秋雨散文集精选
最近评论
fairy 发布于 16 小时前(11月06日) 机器人快来我这里吧!
李锋镝 发布于 16 小时前(11月06日) 都是机器人,防不住
李锋镝 发布于 16 小时前(11月06日) 是的,太烦了
李锋镝 发布于 16 小时前(11月06日) 可以同一台服务器
fairy 发布于 18 小时前(11月06日) 这流量,好厉害啊。我一年都没那么多
标签聚合
Theme Spring AI编程 多线程 Redis SpringBoot IDEA MySQL 分布式 JAVA Claude JVM ElasticSearch 架构 WordPress SQL AI K8s 日常 数据库
友情链接
  • 懋和道人
  • 皮皮社
  • 刘永博客
  • sssr7844的博客
  • Honesty
  • 林羽凡
  • 韩情脉脉
  • 志文工作室
  • 知向前端
  • 哥斯拉
  • 瓦匠个人小站
  • 九仞之行
  • 搬砖日记
  • 彬红茶日记
  • lijie blog
  • Serendipity
  • Mr.Sun的博客
  • 韩小韩博客
  • 老张博客

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号