【MySQL篇07】:redo log日志與buffer pool詳解

文章目錄

  • 1. Buffer Pool 緩沖池
  • 2. redo log (重做日志)
    • redo log 的作用:
    • 為什么需要 redo log buffer?
    • 什么時候刷盤呢?
  • 3. 總結一下 redo log 和 Buffer Pool 在更新數據時的協同工作
    • 關鍵組件關系圖
    • 刷盤完成后

1. Buffer Pool 緩沖池

首先,需要理解一個核心問題:數據庫的更新操作,直接寫到磁盤是非常慢的。 磁盤是機械設備,讀寫速度遠低于內存。如果每次更新都直接寫盤,數據庫的性能會非常差。

為了解決這個問題,數據庫引入了內存緩存的概念,也就是圖中的 Buffer Pool (緩沖池)
MySQL的buffer pool圖示
可以把 Buffer Pool 想象成一個高速緩存區,它存儲了數據庫中經常訪問的數據頁(數據在磁盤上是以“頁”為單位存儲的)。

  • 讀取數據時: 如果要讀取的數據頁已經在 Buffer Pool 中,就直接從內存讀取,速度非常快。如果不在,就需要從磁盤加載到 Buffer Pool 中,然后再從 Buffer Pool 中讀取。
  • 更新數據時: 數據庫并不會直接將更新后的數據寫回磁盤,而是先將更新操作應用到 Buffer Pool 中的數據頁上。

2. redo log (重做日志)

現在問題來了,如果數據只更新到了 Buffer Pool,還沒有寫回磁盤,這個時候數據庫突然崩潰了,怎么辦?內存中的數據就會丟失,導致數據不一致。

這就是 redo log (重做日志) 的作用。

可以把 redo log 想象成一個操作日志本,它記錄了數據庫的所有更新操作

  • 當你執行一個更新操作時,InnoDB 存儲引擎會先將這個更新操作記錄到 redo log buffer (重做日志緩存) 中。
  • 然后,再將更新應用到 Buffer Pool 中的數據頁。

MySQL數據增刪改時候buffer pool和磁盤的情況

這個過程非常重要:先寫日志,再更新內存。 這就是所謂的 WAL (Write-Ahead Logging,先寫日志) 技術

redo log 的作用:

redo log 的主要作用是 保證事務的持久性。即使數據庫崩潰,只要 redo log 中的數據沒有丟失,就可以通過回放 redo log 來恢復崩潰前的數據狀態。

我們結合圖來看整個流程:

[應用程序] ││ UPDATE user SET balance=200 WHERE id=1▼
[InnoDB引擎]├── 1. 從磁盤加載數據頁到 → [Buffer Pool](內存緩沖區)├── 2. 修改Buffer Pool中的數據(產生臟頁)├── 3. 記錄物理修改到 → [redo log buffer](內存)└── 4. 提交事務時將redo log刷盤 → [ib_logfile](磁盤)│└── 后臺線程異步將臟頁刷回磁盤數據文件
  1. 磁盤加載數據放入緩沖池 :當你需要讀取或修改某個數據時,如果它不在 Buffer Pool 中,會先從磁盤加載到 Buffer Pool 中。
  2. 直接更新緩存數據 :更新操作會直接作用于 Buffer Pool 中的數據頁。
  3. 記錄更新信息:同時,這個更新操作的信息會被記錄到 redo log buffer 中。
  4. 清空 redo log buffer 刷盤到 redo 日志中:redo log buffer 中的內容會定期或在特定時機(比如事務提交時)被刷寫到磁盤上的 redo log 文件中。

為什么需要 redo log buffer?

redo log buffer 就像一個臨時的緩沖區,用于存放最近的 redo log 記錄。先寫到 buffer 中比直接寫到磁盤更快。當 buffer 滿了或者滿足其他條件時,才會將 buffer 中的內容批量刷寫到磁盤,減少了磁盤 I/O 的次數。

什么時候刷盤呢?

redo log buffer 刷盤到磁盤的時機有很多種,包括:

  • 事務提交時: 這是最常見的刷盤時機,保證了事務的持久性
  • 當 redo log buffer 空間不足時: 如果 redo log buffer 快滿了,會強制刷盤。
  • 后臺線程定時刷盤: InnoDB 有后臺線程會定期將 redo log buffer 中的內容刷盤。
  • 正常關閉數據庫時: 關閉數據庫之前,會把 redo log buffer 中的內容刷盤。

3. 總結一下 redo log 和 Buffer Pool 在更新數據時的協同工作

  1. 更新操作先寫到 redo log buffer
  2. 更新操作應用到 Buffer Pool 中的數據頁。
  3. redo log buffer 中的內容在合適的時機刷寫到磁盤上的 redo log 文件。
  4. Buffer Pool 中的臟頁(被修改過但還沒寫回磁盤的數據頁)會在合適的時機(比如后臺線程、Buffer Pool 空間不足等)刷寫到磁盤上的數據文件。

通過這種方式,數據庫可以在保證數據持久性的同時,提高更新操作的性能,因為大部分更新操作都先在內存中完成。即使發生崩潰,也可以通過 redo log 來恢復數據。

關鍵組件關系圖

+-------------------+    1.記錄操作     +-------------------+
| redo log buffer   | <--------------  | 事務更新請求       |
| (內存日志緩存)    |                   |                   |
+-------------------+                  +--------+----------+| 2.刷日志(保證持久性)                     | 3.修改內存數據V                                        V
+-------------------+                +----------------------+
| 磁盤 redo log文件  |               | Buffer Pool          |
| (安全存儲的操作記錄)|               | (內存數據頁)          |
+-------------------+                |                      |^                             | 4.標記為臟頁          ||                             +----------------------+|                                        || 5.推進檢查點(釋放日志空間)               | 6.觸發刷盤條件|----------------------------------------+V                                        V
+-------------------+                +----------------------+
| 磁盤數據文件       | <------------- | 后臺線程刷臟頁        |
| (最終持久化數據)   |  7.覆蓋寫數據   | (將臟頁內容寫入磁盤)  |
+-------------------+                +----------------------+

刷盤完成后

  • 臟頁變干凈:Buffer Pool 中該頁標記為「非臟頁」(與磁盤一致)
  • 推進檢查點 (Checkpoint)
    • 系統記錄:「此臟頁數據已落盤,其對應的 redo log 記錄可被覆蓋」
    • 磁盤 redo log 文件:釋放舊日志空間(循環復用)
      磁盤一致)
  • 推進檢查點 (Checkpoint)
    • 系統記錄:「此臟頁數據已落盤,其對應的 redo log 記錄可被覆蓋」
    • 磁盤 redo log 文件:釋放舊日志空間(循環復用)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84534.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt Library庫系列----Serial串口

前言 每次寫串口相關的功能時&#xff0c;總是需要重新寫或者復制原來寫過的文件&#xff0c;容易出錯不說&#xff0c;這也不是碼農的風格&#xff0c;所以還是得有一套自己得代碼庫&#xff0c;方便調用&#xff0c;又能保持神秘感。 一、開發需求 1.有個實例類&#xff1b;…

第八節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(下)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

Redis 性能瓶頸時如何處理?

當 Redis 遇到性能瓶頸時&#xff0c;需要從多個維度進行排查和優化。以下是系統化的解決方案&#xff0c;涵蓋硬件、配置、數據模型、網絡等關鍵點&#xff1a; 一、硬件資源優化 內存瓶頸 現象&#xff1a;頻繁觸發 OOM 或 used_memory 接近物理內存。解決&#xff1a; 升級服…

多相機三維人臉掃描儀:超寫實數字人模型制作“加速器”

超寫實數字人&#xff0c;又稱“數字分身”&#xff0c;是以真人形象為原型構建的高仿真虛擬形象&#xff0c;按維度可分為2D數字人與3D數字人。這類數字人已廣泛應用于影視制作、游戲交互、品牌直播等場景&#xff0c;其核心價值在于通過技術手段實現真人形象的數字化復刻&…

ceph 自動調整 pg_num

要讓 Ceph 的 pool 自動調整 pg_num(PG 數量),你需要啟用 PG autoscaler。這是從 Ceph Octopus(15.x) 開始引入的功能,能根據池的容量和對象數量自動建議或調整 pg_num,以實現負載均衡。 ? 一步步開啟 Pool 的 pg_num 自動調整 1. 啟用 PG autoscaler 模塊(通常默認啟…

Python Beautiful Soup 4【HTML/XML解析庫】 簡介

全面剖析大模型 圖解大模型&#xff1a;生成式AI原理與實戰 大語言模型大模型應用開發Transformer DeepSeek模型原理開發深度學習 圖靈出品 大模型強化學習詳解 大模型算法&#xff1a;強化學習、微調與對齊&#xff08;全彩&#xff09;詳解強化學習 RLHF GRPO DPO SFT CoT D…

AI Agent開發與安全

AI Agent的核心演進 Level 1&#xff1a;LLM Agent&#xff08;聊天機器人&#xff09; 特點&#xff1a;靠提示詞工程賦予人設&#xff08;如星座占卜、角色扮演&#xff09;&#xff0c;但存在幻覺問題&#xff0c;輸出不可控。局限&#xff1a;娛樂性強&#xff0c;難勝任嚴…

NumPy玩轉數據科學

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 一、引言二、NumPy 概述2.1 NumPy 的定義與發展2.2 NumPy 的重要性 三、NumPy 的多維數組支持3.1 多維數組的概念3.2 多維數組的創建與操作3.2.1 數組的創建3.2.2 數組的索引和切片3.2.3 數組的運…

【uniapp小程序開發】圖表組件ucharts的使用(入門)

一、插件的安裝 安裝非常簡單&#xff0c;打開uniapp的插件市場&#xff0c;導入到項目中即可 下載地址&#xff1a;https://ext.dcloud.net.cn/plugin?id271 二、開始實踐 先看頁面的效果 頁面中實現了三個基本圖形的展示&#xff1a;折線圖、餅圖和柱狀圖。 上圖左一&a…

APISIX+etcd高可用集群部署方案詳解

#作者&#xff1a;任少近 文章目錄 一、背景二、部署etcd1、etcd的svc部署yaml2、Etcd 服務定義說明3、etcd的statefulset部署yaml4、Etcd 狀態集&#xff08;StatefulSet&#xff09;配置說明5、查看集群狀態 三、部署apisix的deployment部署1、apisix部署yaml文件2、APISIX …

Excel常用公式大全

資源寶整理分享&#xff1a;https://www.httple.net Excel常用公式大全可以幫助用戶提高工作效率&#xff0c;掌握常用的Excel公式&#xff0c;讓數據處理和計算工作更加便捷高效。了解公式學習方法、用途&#xff0c;不再死記硬背&#xff0c;拒絕漫無目的。 命令用途注釋說…

什么是Seata?

深入解析Seata&#xff1a;分布式事務的終極解決方案 什么是Seata&#xff1f; Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一款開源的分布式事務解決方案&#xff0c;由阿里巴巴中間件團隊于2019年1月發起并開源&#xff08;最初…

【系統規劃與管理師第二版】1.3 新一代信息技術及發展

一、物聯網 物聯網&#xff08;IoT&#xff09;是指通過信息傳感設備&#xff0c;按約定的協議將任何物品與互聯網相連接&#xff0c;進行信息交換和通信&#xff0c;以實現智能化識別、定位、跟蹤、監控和管理的網絡。物聯網主要解決物品與物品&#xff08;T2T&#xff09;、人…

在Spring Boot中自定義JSON返回日期格式的指南

在開發Spring Boot應用時&#xff0c;很多時候需要在返回的JSON數據中以特定格式顯示日期和時間。例如&#xff0c;使用LocalDateTime、Date等類型的字段時&#xff0c;默認的序列化格式可能不是你期望的路徑。本文將介紹如何在Spring Boot中實現控制返回JSON數據的日期格式&am…

【大數據高并發核心場景實戰】 - 數據持久化之冷熱分離

大數據高并發核心場景實戰 - 數據持久化之冷熱分離 當云計算平臺的業務后臺處理工單突然接入客服系統的請求洪流&#xff0c;每日新增10萬工單&#xff0c;3000萬主表1.5億明細表的數據庫開始呻吟——是時候請出「冷熱分離」這劑退燒藥了&#xff01; 一、業務場景&#xff1a;…

【AI Study】第四天,Pandas(6)- 性能優化

文章概要 本文詳細介紹 Pandas 的性能優化技術&#xff0c;包括&#xff1a; 內存優化計算優化大數據處理實際應用示例 內存優化 數據類型優化 # 查看數據類型 df.dtypes# 查看內存使用情況 df.memory_usage(deepTrue)# 優化數值類型 # 將 float64 轉換為 float32 df[floa…

c++系列之智能指針的使用

&#x1f497; &#x1f497; 博客:小怡同學 &#x1f497; &#x1f497; 個人簡介:編程小萌新 &#x1f497; &#x1f497; 如果博客對大家有用的話&#xff0c;請點贊關注再收藏 &#x1f31e; 智能指針的使用及原理 AII&#xff08;Resource Acquisition Is Initializatio…

知識蒸餾(Knowledge Distillation, KD)

知識蒸餾&#xff08;Knowledge Distillation, KD&#xff09;是一種模型壓縮與知識遷移技術&#xff0c;通過讓小型學生模型&#xff08;Student&#xff09;模仿大型教師模型&#xff08;Teacher&#xff09;的行為&#xff08;如輸出概率分布或中間特征表示&#xff09;&…

chatGPT 會擴大失業潮嗎?

擊上方關注 “終端研發部” 設為“星標”&#xff0c;和你一起掌握更多數據庫知識 對于部分人而言&#xff0c;失業是必然趨勢。 這不&#xff0c;身后的一測試大哥&#xff0c;自從公司解散之后&#xff0c;已經在家待業半年了。。。 自打OpenAI推出了chatGPT3.0之后&#xff…