PostgreSQL 的 MVCC 机制了解

PostgreSQL 的 MVCC 机制了解

PostgreSQL 使用多版本并发控制(MVCC)作为其核心并发控制机制,这是它与许多其他数据库系统的关键区别之一。MVCC 允许读操作不阻塞写操作,写操作也不阻塞读操作,从而提供高度并发性。

一 MVCC 基本原理

1.1 MVCC 核心概念

  • 多版本:每行数据可以有多个版本同时存在
  • 快照隔离:每个事务看到的是数据库在某个时间点的"快照"
  • 无读锁:读操作不需要获取锁,不会阻塞写操作
  • 写操作优化:写操作创建新版本而非直接修改现有数据

1.2 与传统锁机制对比

特性传统锁机制MVCC
读-写冲突读写互相阻塞读写不互相阻塞
并发度较低较高
实现复杂度相对简单较复杂
存储开销较小较大(需要版本存储)

二 PostgreSQL MVCC 实现细节

2.1 系统列(System Columns)

PostgreSQL 每行数据都包含几个隐藏的系统列:

SELECT xmin, xmax, cmin, cmax, ctid, * FROM your_table;
  • xmin:创建该行版本的事务ID(插入事务)
  • xmax:删除/锁定该行版本的事务ID(初始为0)
  • cmin/cmax:事务内的命令标识符
  • ctid:行版本在表中的物理位置

2.2 事务状态与可见性判断

PostgreSQL 通过比较事务ID(xmin, xmax)和事务快照来判断行版本是否可见:

  1. 如果 xmin 未提交或晚于当前事务快照 → 不可见
  2. 如果 xmax 已提交且早于当前事务快照 → 不可见(已删除)
  3. 否则可见

2.3 事务ID管理

  • 事务ID是32位整数,约40亿个可能值
  • PostgreSQL 使用事务ID环绕保护机制
  • 通过vacuum过程冻结旧的事务ID

三 MVCC 具体行为示例

3.1 插入操作

-- 事务1
BEGIN;
INSERT INTO test VALUES (1, 'data');
-- 此时xmin=当前事务ID, xmax=0
COMMIT;

3.2 更新操作(实际是删除+插入)

-- 事务2
BEGIN;
UPDATE test SET value = 'new' WHERE id = 1;
-- 原行xmax设置为事务2的ID
-- 新行xmin=事务2的ID, xmax=0
COMMIT;

3.3 删除操作

-- 事务3
BEGIN;
DELETE FROM test WHERE id = 1;
-- 行xmax设置为事务3的ID
COMMIT;

四 MVCC 存储实现

4.1 表文件结构

  • 主数据文件(oid)存储当前行版本
  • 每个行版本都包含xmin/xmax等系统字段
  • 更新操作不会原地修改,而是创建新版本

4.2 事务快照

-- 查看当前事务快照
SELECT pg_current_snapshot();
-- 输出示例: 100:100:
-- 格式为 xmin:xmax:xip_list

4.3 可见性映射(Visibility Map)

  • 标记哪些数据块只包含对所有事务可见的元组
  • 加速vacuum过程

五 MVCC 维护机制

5.1 VACUUM 机制

-- 常规vacuum(不锁表)
VACUUM [VERBOSE] [ANALYZE] table_name;-- 全量vacuum(需要锁)
VACUUM FULL [VERBOSE] table_name;

VACUUM作用

  • 回收死元组占用的空间
  • 冻结旧的事务ID防止环绕
  • 更新优化器统计信息
  • 更新可见性映射

5.2 自动vacuum

-- 查看自动vacuum设置
SELECT name, setting FROM pg_settings WHERE name LIKE 'autovacuum%';-- 重要参数
autovacuum = on                     -- 是否启用
autovacuum_vacuum_threshold = 50    -- 触发vacuum的更新/删除元组阈值
autovacuum_analyze_threshold = 50   -- 触发analyze的更新/删除元组阈值
autovacuum_vacuum_scale_factor = 0.2-- 表大小的缩放因子

六 MVCC 优缺点分析

优势

  1. 高并发:读写不互相阻塞
  2. 读一致性:事务看到一致的快照
  3. 避免锁竞争:减少锁等待时间
  4. 回滚高效:不需要专门的回滚段

劣势

  1. 存储开销:需要保留多个版本
  2. 维护成本:需要定期vacuum
  3. 更新性能:更新实质是删除+插入
  4. 表膨胀:不当维护会导致空间浪费

七 MVCC 优化建议

7.1 合理配置autovacuum

-- 对大表调整autovacuum参数
ALTER TABLE large_table SET (autovacuum_vacuum_scale_factor = 0.05,autovacuum_vacuum_threshold = 10000
);

7.2 监控表膨胀

-- 查看表膨胀情况
SELECT schemaname, relname,pg_size_pretty(pg_relation_size(relid)) as size,n_dead_tup,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

7.3 定期维护

-- 对大表定期手动vacuum
VACUUM (VERBOSE, ANALYZE) large_table;-- 在低峰期执行vacuum full
VACUUM FULL VERBOSE table_name;

7.4 事务设计优化

  • 避免长时间运行的事务
  • 将大事务拆分为小事务
  • 避免在事务中执行不必要的查询

谨记:心存敬畏,行有所止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析

互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析 面试场景 面试官:马架构,您好!欢迎参加我们的面试。今天我们将围绕消息中间件展开讨论,尤其是RocketMQ、RabbitMQ和Kafka。您有十年的Java研发和架构设计经…

《巧用DeepSeek快速搞定数据分析》书籍分享

文章目录 前言内容简介作者简介购书链接书籍目录 前言 随着大数据时代的到来,数据分析和人工智能技术正迅速改变着各行各业的运作方式。DeepSeek作为先进的人工智能模型,不仅在自然语言处理领域具有广泛应用,还在数据分析、图像识别、推荐系…

4.Three.js 中 Camera 摄像机详解

一、什么是 Camera? 在 Three.js 中,Camera(摄像机)决定了我们如何观察三维场景。 你可以把它理解为我们“眼睛”的位置和方向,场景中的物体再复杂,如果没有摄像机,就没有“观察角度”&#x…

gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词所以用英语表达)

Current gem5-gpu Software Architecture 这是当前gem5-gpu软件架构的示意图。 Ruby是在gem5-gpu上下文中用于处理CPU和GPU之间内存访问的高度可配置的内存系统 CudaCore (src/gpu/gpgpu-sim/cuda_core.*, src/gpu/gpgpu-sim/CudaCore.py) Wrapper for GPGPU-Sim shader_cor…

负载均衡的实现方式有哪些?

负载均衡实现方式常见的有: 软件负载均衡、硬件负载均衡、DNS负载均衡 扩展 二层负载均衡:在数据链路层,基于MAC地址进行流量分发,较少见于实际应用中 三层负载均衡:在网络层,基于IP地址来分配流量,例如某…

MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异

以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异: 1. MyBatis 和 MyBatis-Plus 核心对比 特性MyBatisMyBatis-Plus定位基础持久层框架MyBatis 的增强版,提供代码生…

《数据结构世界的乐高积木:顺序表的奇幻旅程》

目录 1. 线性表 2. 顺序表 2.1 概念与结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3 动态顺序表的实现 1. 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的…

RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站

一、题目要求 1.配置ssh实现A,B主机互相免密登录 2.配置nginx服务,通过多ip区分多网站 二、实验 实验开始前需准备两台 linux 主机便于充当服务端以及客户端,两台主机 IP 如下图: 实验1:配置 ssh 实现 A&#xff0…

第十五届蓝桥杯 2024 C/C++组 好数

题目: 题目描述: 题目链接: 好数 思路: 第一种思路详解: 因为每次检查数都是从个位开始,所以对于每一个数都是先检查奇数位再检查偶数位,即存在先检查奇数位再检查偶数位的循环。注意一次完…

展锐Android13状态栏默认显示电池电量百分比

展锐Android13电池状态默认不显示电池电量百分比&#xff0c;打开 /frameworks/base/packages/SettingsProvider/res/values/defaults.xml 在xml的文件最后&#xff0c;增加一项配置def_show_battery_percent&#xff1a; <?xml version"1.0" encoding"u…

OpenCV 高斯模糊 cv2.GaussianBlur

OpenCV 高斯模糊 cv2.GaussianBlur flyfish cv2.GaussianBlur 是 OpenCV 库中用于对图像进行高斯模糊处理的函数。 高斯模糊的含义 高斯模糊是一种常见的图像滤波技术&#xff0c;它可以对图像进行平滑处理&#xff0c;减少图像中的噪声和细节&#xff0c;使得图像看起来更…

[密码学基础]密码学发展简史:从古典艺术到量子安全的演进

密码学发展简史&#xff1a;从古典艺术到量子安全的演进 密码学作为信息安全的基石&#xff0c;其发展贯穿人类文明史&#xff0c;从最初的文字游戏到量子时代的数学博弈&#xff0c;每一次变革都深刻影响着政治、军事、科技乃至日常生活。本文将以技术演进为主线&#xff0c;…

PostgreSQL认证培训推荐机构

首先来看一张2025年4月份db-engines上的数据库排行情况&#xff0c;前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server&#xff0c;排名第四的就是我们今天的主角 - PostgreSQL数据库&#xff0c;从这张图上可以看出&#xff0c;PostgreSQL数据库的上升超非常明显&#x…

STM32 CubeMx下载及安装(一)

CubeMx及Java下载安装&#xff08;一&#xff09; 1 背景1.1 基本介绍1.2 主要特点1.3 相关准备 2 软件下载2.1 Java 官网下载2.2 CubeMx官网下载2.4 CubeMX网盘下载 3 软件安装3.1 Java 软件安装3.1.1 安装过程 3.2 CubeMx软件安装 总结 1 背景 1.1 基本介绍 STM32CubeMX&am…

Spring Boot 应用优雅关闭

写这篇文章是因为看到 “线程池在使用结束后应该正确关闭.” 那么如果我们的 Spring 应用都无法正确关闭, 那么线程池肯定也无从保障 1. 优雅关闭 kill with pid, without -9 大多数情况下无须在意这个问题, 正确使用 kill 命令关闭就行 (注意不能使用 kill -9) kill $(cat …

linux与c语言基础知识(未全部完成)

文章很多处理论&#xff0c;没办法写出来&#xff0c;&#xff08;linux的一些理论问题&#xff0c;我有时间后&#xff0c;会逐个解决&#xff09; 文章大多数的理论来字这个链接&#xff0c; C语言快速入门-C语言基础知识-CSDN博客 一. linux&#xff08;Ubuntu&#xff09; …

面试经历(一)雪花算法

uid生成方面 1&#xff1a;为什么用雪花算法 分布式ID的唯一性需要保证&#xff0c;同时需要做到 1&#xff1a;单调递增 2&#xff1a;确保安全&#xff0c;一个是要能体现出递增的单号&#xff0c;二一个不能轻易的被恶意爬出订单数量 3&#xff1a;含有时间戳 4&#…

基于GA遗传优化TCN-BiGRU注意力机制网络模型的时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b&#xff08;提供软件版本下载&#xff09; 3.部分核心程序 &#xff08;完整版代码包…

深度强化学习 pdf 董豪| 马尔科夫性质,马尔科夫过程,马尔科夫奖励过程,马尔科夫决策过程

深度强化学习 pdf 百度云 hea4 pdf 主页 概念 马尔可夫奖励过程和价值函数估计的结合产生了在绝大多数强化学习方法中应用的核心结果——贝尔曼 &#xff08;Bellman&#xff09;方程。最优价值函数和最优策略可以通过求解贝尔曼方程得到&#xff0c;还将介绍三种贝尔曼 方…

验证Kubernetes的服务发现机制

验证Kubernetes的服务发现机制 文章目录 验证Kubernetes的服务发现机制[toc]一、验证基于环境变量的服务发现机制 服务发现是让客户端能够以固定的方式获取到后端Pod访问地址的机制。下面验证环境变量和DNS这两种机制。 一、验证基于环境变量的服务发现机制 对于需要访问服务…