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.pswp.cn/web/76959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76959.shtml
英文地址,請注明出處:http://en.pswp.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這兩種機制。 一、驗證基于環境變量的服務發現機制 對于需要訪問服務…