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_count 和 dead_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聊天窗口隐藏
活动邀请函制作网站有哪些,活动邀请函文案?

