SQL数据库历史版本膨胀_MVCC副作用

发布时间 - 2026-01-09 00:00:00    点击率:
PostgreSQL易发生历史版本膨胀,因其MVCC将旧版本保留在原数据页标记为dead,依赖vacuum清理;而MySQL将旧版本存于独立undo表空间,主表仅存最新版。

PostgreSQL 的 MVCC 机制本身不是问题,但它是历史版本膨胀的直接源头。它不删旧数据,而是标记为“死元组”,等 vacuum 清理——如果清理跟不上,就堆出“虚胖”。

为什么 PG 容易膨胀,而 MySQL 不明显?

关键在 MVCC 实现方式不同:

  • MySQL InnoDB 把旧版本存进独立的 undo 表空间,主表只存最新版,物理文件基本不膨胀;
  • PostgreSQL 直接把旧版本保留在原数据页里,标记 dead 但不立即移走,导致同一张表里混着大量无效数据;
  • 这种设计换来了瞬时回滚、无需预估 undo 空间等优势,代价就是必须靠 vacuum 主动“打扫”。

哪些操作最容易触发膨胀?

不是所有写入都一样,以下三类最危险:

  • 高频 UPDATE/DELETE:每改一行就多一个死元组,尤其更新主键或索引字段时,还会连带产生索引膨胀;
  • 长事务未结束:只要有一个事务还在运行(哪怕只是 SELECT),vacuum 就不敢清理它可能用到的旧版本,死元组越积越多;
  • autovacuum 配置过松:比如 autovacuum_vacuum_scale_factor 设成 0.2(默认值),意味着表增长 20% 才触发 vacuum,对大表等于“等死”。

膨胀不只是占空间,它会层层恶化性能

一旦开始膨胀,影响是连锁的:

  • 顺序扫描变慢:即使查 10 行有效数据,也可能扫完整个 100GB 表文件,因为要跳过大量 dead 元组;
  • 索引失效:B-tree 索引指向的可能是已 dead 的行,查询命中索引后还得回表过滤,实际变成“假索引”;
  • VACUUM 自身变重:膨胀越严重,一次 vacuum 越耗 CPU 和 I/O,可能拖慢业务,甚至引发锁等待;
  • 极端情况触发事务 ID 回卷:pg_xact 文件里的事务号快用完却清不掉旧元组,数据库会强制只读保护,服务中断。

怎么快速判断是不是膨胀了?

别猜,用系统视图看真实数据:

  • 先装扩展:CREATE EXTENSION pgstattuple;
  • 查单表:SELECT * FROM pgstattuple('schema.table_name'); 关注 dead_tuple_countdead_tuple_percent
  • 批量筛查:SELECT schemaname||'.'||relname, n_dead_tup, pg_size_pretty(pg_total_relation_size(oid)) FROM pg_stat_all_tables ORDER BY n_dead_tup DESC LIMIT 10;

死元组占比超 10%,或绝对数量达百万级,就该干预了。


# mysql  # 为什么  # sql  # select  #   # delete  # postgresql  # 数据库  # 旧版本  # 还在  # 还会  # 它是  # 还得  # 越多  # 但不  # 它会  # 它不  # 就该 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 在线制作视频网站免费,都有哪些好的动漫网站?  jQuery 常见小例汇总  Windows Hello人脸识别突然无法使用  教你用AI将一段旋律扩展成一首完整的曲子  EditPlus 正则表达式 实战(3)  Laravel怎么清理缓存_Laravel optimize clear命令详解  phpredis提高消息队列的实时性方法(推荐)  韩国服务器如何优化跨境访问实现高效连接?  Laravel怎么在Controller之外的地方验证数据  实现点击下箭头变上箭头来回切换的两种方法【推荐】  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何配置和使用缓存?(Redis代码示例)  Bootstrap整体框架之CSS12栅格系统  C#如何调用原生C++ COM对象详解  装修招标网站设计制作流程,装修招标流程?  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  javascript基本数据类型及类型检测常用方法小结  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  php json中文编码为null的解决办法  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel中的withCount方法怎么高效统计关联模型数量  音响网站制作视频教程,隆霸音响官方网站?  详解CentOS6.5 安装 MySQL5.1.71的方法  如何为不同团队 ID 动态生成多个独立按钮  Laravel如何使用Eloquent进行子查询  ,网页ppt怎么弄成自己的ppt?  Python文件流缓冲机制_IO性能解析【教程】  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何使用模型观察者?(Observer代码示例)  iOS UIView常见属性方法小结  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  北京网站制作公司哪家好一点,北京租房网站有哪些?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  iOS正则表达式验证手机号、邮箱、身份证号等  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何快速生成橙子建站落地页链接?  香港网站服务器数量如何影响SEO优化效果?  Android实现代码画虚线边框背景效果  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何用VPS主机快速搭建个人网站?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何在企业微信快速生成手机电脑官网?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  活动邀请函制作网站有哪些,活动邀请函文案?