李锋镝的博客

  • 首页
  • 时间轴
  • 评论区显眼包🔥
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 中间件
  3. 正文

深入了解PostgreSQL

2025年11月17日 161点热度 0人点赞 0条评论

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 是最优解之一。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/zhong-jian-jian/4579

相关文章

  • 千万级大表新增字段实战指南:告别锁表与业务中断
  • 高性能场景为什么推荐使用PostgreSQL,而非MySQL?
  • 数据库事务的隔离级别
  • 在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/=/<= 这类比较运算符,哪一个的性能更优。
  • 为什么MySQL要“小表驱动大表”
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: MySQL PostgreSQL SQL 数据库
最后更新:2025年11月17日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌他、晚来风急!雁过也,正伤心,却是旧时相识。
满地黄花堆积,憔悴损,如今有谁堪摘?守着窗儿,独自怎生得黑!梧桐更兼细雨,到黄昏、点点滴滴。这次第,怎一个愁字了得!

那年今日(01月25日)

  • 1979年:中国左翼文学运动开创者之一郑伯奇逝世
  • 1949年:日本帝国时期的政治家牧野伸显逝世
  • 1924年:第一届奥林匹克冬季运动会在夏蒙尼开幕
  • 1911年:中国第一部专门刑法典颁布
  • 1504年:意大利艺术家米开朗基罗完成大卫雕像
  • 更多历史事件
最新 热点 随机
最新 热点 随机
AI时代,个人技术博客的出路在哪里? 什么是Meta Server? 千万级大表新增字段实战指南:告别锁表与业务中断 在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/=/ 深度解析 Disruptor:无锁队列的高性能实现与实践 精通Linux根目录:核心文件夹深度解析与实战指南
玩博客的人是不是越来越少了?准备入手个亚太的ECS,友友们有什么建议吗?AI时代,个人技术博客的出路在哪里?使用WireGuard在Ubuntu 24.04系统搭建VPNWordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了
基于Java8的Either类 居家办公了~ 祝大家六一儿童节快乐~~~ IntelliJ IDEA 2020.3.x永久白嫖(Windows/Mac) 看病难~取药难~~ 睡觉睡不踏实
标签聚合
WordPress K8s 分布式 AI编程 多线程 设计模式 JAVA ElasticSearch Redis SpringBoot JVM SQL AI docker IDEA 架构 MySQL 日常 数据库 Spring
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos Made By Dylan

津ICP备2024022503号-3

京公网安备11011502039375号