当前位置: 首页 > news >正文

PostgreSQL MVCC - BinBin

一、核心概念概述

PostgreSQL 采用 MVCC(多版本并发控制)机制,实现:
  • 读写不阻塞
  • 数据一致性隔离
  • 提高并发性能
核心思想:同一条记录在不同时刻会产生多个版本,查询根据事务快照选择"可见版本"

二、核心数据结构

每一元组(Tuple)包含关键隐藏字段:
字段
含义
xmin
创建该版本的事务ID
xmax
删除/更新该版本的事务ID
tuple version
数据的一个历史状态
执行 UPDATE test SET name='C' WHERE id=1,版本演化结果:
版本
xmin
xmax
name
A
100
200
A
B
200
300
B
C
300
NULL
C
关键理解
  • 每一次 UPDATE = 产生一个新版本
  • 老版本通过 xmax 标记“被替换”
  • 当前版本通过 xmax = NULL 表示“仍然有效”

三、事务快照(Snapshot)

每个事务执行时都会生成快照,这一点和MySQL一样:
字段
含义
xmin
当前最小活跃事务ID
xmax
当前最大活跃事务 ID + 1
xip[]
活跃事务列表

四、MVCC 可见性判断规则

判断一个版本是否可见,本质是:
  1. xmin 已提交
  2. xmax 未提交 或未发生
  3. 不属于当前 xip 冲突事务

五、Freeze 原理

Freeze = 把 tuple 的 xmin 从普通事务ID改成 FrozenXID,让它"永远可见"

5.1 为什么必须要 Freeze

PostgreSQL 每一行都有:
  • xmin:创建该行的事务ID
  • xmax:删除/更新该行的事务ID
事务ID是 32位循环的(会回绕)假设:
  • 老数据 xmin = 10
  • 当前事务ID = 4,000,000,000
由于回绕:PostgreSQL 可能会误判:xmin=10 是“未来事务”(非常危险)

5.2 Freeze 的解决方案

把:xmin = 10变成:xmin = FrozenXID (通常是2)
效果:
  • 永远可见
  • 不再参与事务可见性判断
  • 不受回绕影响

5.3 Freeze 具体做了什么

当执行 Freeze 时:
  1. 扫描表(heap)
  2. 找到老 tuple(xmin 很旧)
  3. 修改:xmin → FrozenXID
  4. 设置 hint bits(减少后续判断成本)

5.4 Freeze 触发机制

自动触发(autovacuum)
  • autovacuum_freeze_max_age(默认 200M)当数据库接近这个值,会触发 强制 vacuum freeze
  • vacuum_freeze_table_age控制表达到多少年龄开始 freeze
  • vacuum_freeze_min_age控制多老的 tuple 才允许被冻结

5.4 强制 Freeze(防止数据库挂掉)

如果接近极限(≈ 2^31),PostgreSQL 会停止写入,报错:database is not accepting commands to avoid wraparound data loss,此时必须立即:VACUUM FREEZE;

5.5 Freeze 的两种模式

普通 Freeze(lazy vacuum)
特点:
  • 只处理部分页面
  • 受 visibility map 控制
  • 性能影响小
Aggressive Freeze(激进)
触发条件:
  • 接近 autovacuum_freeze_max_age
特点:
  • 全表扫描
  • 忽略 visibility map
  • IO 很重

六、Visibility Map(VM,可见性映射)

6.1 VM 的作用

VM 记录每个数据页(page)的状态:
标记
含义
all-visible
页面所有 tuple 对所有事务可见
all-frozen
页面数据已冻结(Freeze 完成)

6.2 优化作用一:跳过 MVCC 判断

如果 page = all-visible: 查询可直接返回数据,无需逐条检查:xmin,xmax和xip

6.3 优化作用二:Index-Only Scan

当满足以下条件:
  • 查询字段全部在索引中
  • 对应 page 被标记为 all-visible
PostgreSQL 可以执行:Index-Only Scan
例子:SELECT name FROM test WHERE id = 1;
优化前:
  • 访问 index + heap
  • 做 MVCC 判断
优化后(Index-Only Scan):
  • 仅访问 index
  • 不访问 heap
  • 不做 tuple 可见性判断

七、完整执行流程

执行:SELECT name FROM test WHERE id = 1; 流程如下:
  • 获取事务快照(xmin / xmax / xip)
  • 通过索引定位数据
  • 检查 Visibility Map

    • all-visible → 直接返回
    • 否则进入 MVCC 判断

      • MVCC 判断

        • 基于 xmin 判断是否存在
        • 基于 xmax 判断是否仍有效
        • 基于 xip 判断事务冲突
  • 返回最终版本
  • 后台优化

    • VACUUM 清理旧版本
    • Freeze 防止 XID 回绕
    • VM 持续提升 Index-Only Scan 命中率
http://www.jsqmd.com/news/644469/

相关文章:

  • 深度解析:如何用Speechless高效备份微博内容到PDF
  • WiFiAnalyzer深度解析:Android上不可或缺的Wi-Fi网络优化利器
  • XUnity.AutoTranslator:3步解决Unity游戏语言障碍,零配置开启全球游戏之旅
  • 从代码到清晰世界:一款基于视觉信号原理的数字化视力恢复训练软件深度解析
  • LXC 运行linux桌面软件的原理实现
  • CCS 7.4版本软件仿真功能移植实战:从环境配置到Hello World验证
  • 终极B站字幕下载指南:3种简单方案对比与完整教程
  • AD7124多通道读取踩坑记:PGA=1时±2V以上电压采样失真的排查与修复
  • 极简开发新选择:VFB迷你版与VB6/7的高效编程实践
  • 仿石漆生产企业选择哪家好,售后完善的厂家口碑大盘点 - 工业设备
  • GPT-SoVITS语音克隆终极教程:5秒音频打造专属AI语音助手
  • 2026年赣州全屋整装装修公司怎么选?雅美居装饰官方联系方式与竞品深度横评 - 精选优质企业推荐榜
  • LFM2.5-1.2B-Thinking-GGUF模型精调实战:基于特定领域数据的性能提升
  • Zotero 7搭配Attanger插件:打造比官方同步更稳的OneDrive文献工作流(含手机端适配技巧)
  • 【多模态大模型域适应终极指南】:20年AI架构师亲授3类工业级适配范式与5大避坑红线
  • 为什么 Vue 3 的 v-for 中 key 如此重要?从 Diff 算法角度看真相
  • 重疾险拒赔|陕西西安先天性畸形免责争议,新沃律师两审胜诉获赔30万元并豁免保费 - 铅笔写好字
  • Mem Reduct:如何用2MB工具释放Windows系统300%内存潜力?
  • Jellyfin Android TV客户端版本兼容性问题的终极解决方案:深度解析与快速修复指南
  • KMS_VL_ALL_AIO:终极Windows和Office智能激活解决方案完整指南
  • 深度剖析室内装修公司服务选择哪家好,分享高性价比装修公司 - 工业推荐榜
  • Profinet协议核心特性与工业自动化应用解析
  • 检查 AMD ROCm / RCCL 安装情况并可自动修复的脚本。
  • 6个Linux CPU调优实战技巧,第三个帮你解决CPU飙升
  • 武汉佰利和建筑防水工程有限公司:武汉市防水维修哪家专业 - LYL仔仔
  • OpenClaw怎么集成?2026年腾讯云8分钟小白超简单流程及大模型百炼Coding Plan步骤
  • 升降炉品牌选购指南:国内知名生产商与优质源头厂家推荐 - 品牌推荐大师1
  • 5大核心功能全解析:LibreHardwareMonitor高效硬件监控完整指南
  • VideoDownloadHelper视频下载助手:如何轻松保存网页视频的完整指南
  • 解锁Mac新维度:用PlayCover在Apple Silicon上畅享iOS生态