欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

PostgreSQL MVCC 与 VACUUM 运行机制深度剖析

发表于:|最后更新:|分类:数据库与存储|阅读:6955 次

PostgreSQL 采用多版本并发控制(MVCC)来支持事务的高并发读写与隔离性。与其他采用 Undo Log 重构历史版本的数据库(如 MySQL InnoDB)不同,PostgreSQL 采用“行内多版本”策略。每次执行 UPDATE 操作时,旧元组(Tuple)并不会被物理覆写,而是被标记为失效,并在数据页中插入一条全新的元组。

每个数据元组的头部包含了两个核心系统字段:xmin(插入该元组的事务 ID)和 xmax(删除或更新该元组的事务 ID)。事务在执行读取查询时,引擎会生成一个快照(Snapshot),记录当前处于活跃状态(未提交)的事务列表 active_txids、最小未提交事务 ID xmin 以及全局分配的最大事务 ID xmax。读取规则严格遵循可见性算法:仅当元组由已提交事务创建且尚未被已提交事务删除时,该版本对当前事务可见。

这种设计不可避免地引入了“表膨胀”(Table Bloat)现象。失效的死元组(Dead Tuples)仍占据磁盘页面。VACUUM 机制负责扫描数据页、回收不可见的死元组空间,并维护可见性映射表(Visibility Map, VM)与自由空间映射表(Free Space Map, FSM)。针对极高写入负载系统,必须精细调整 autovacuum_vacuum_cost_limit 与 autovacuum_vacuum_scale_factor,防止垃圾回收滞后拖垮 I/O 吞吐。