MySQL--》深度解析InnoDB引擎的存儲與事務機制

目錄

InnoDB架構

事務原理

MVCC


InnoDB架構

從MySQL5.5版本開始默認使用InnoDB存儲引擎,它擅長進行事務處理,具有崩潰恢復的特性,在日常開發中使用非常廣泛,其邏輯存儲結構圖如下所示,

下面是InnoDB架構圖,左側為內存結構,右 側為磁盤結構,如下所示:

內存結構:主要有以下幾部分組成,其特點如下所示:

1)Buffer Pool:緩沖池是主內存中的一個區域,里面可以緩存磁盤上經常操作的真實數據,在執行增刪改查操作時,先操作緩沖池中的數據(若緩沖池沒有數據,則從磁盤加載并緩存),然后再以一定頻率刷新到磁盤,從而減少磁盤I0,加快處理速度。

緩沖池:以Page頁為單位,底層采用鏈表數據結構管理Page,根據狀態可以將Page分為三種類型:

free page:空閑page,未被使用。·

cleanpage:被使用page,數據沒有被修改過。·

dirtypage:臟頁,被使用page,數據被修改過,也中數據與磁盤的數據產生了不一致。

2)ChangeBuffer:更改緩沖區(針對于非唯一二級索引頁),在執行DML語句時,如果這些數據Page沒有在BufferPool中,不會直接操作磁盤,而會將數據變更存在更改緩沖區ChangeBuffer中,在未來數據被讀取時,再將數據合并恢復到BufferPool中,再將合并后的數據刷新到磁盤中。與聚集索引不同,二級索引通常是非唯一的,并且以相對隨機的順序插入二級索引。同樣,刪除和更新可能會影響索引樹中不相鄰的二級索引頁,如果每一次都操作磁盤,會造成大量的磁盤IO。有了ChangeBuffer之后,我們可以在緩沖池中進行合并處理,減少磁盤lO。

3)AdaptiveHashIndex:自適應hash索引,用于優化對BufferPool數據的查詢。InnoDB存儲引擎會監控對表上各索引頁的查詢,如果觀察到hash索引可以提升速度,則建立hash索引l,稱之為自適應hash索引。自適應哈希索引,無需人工干預,是系統根據情況自動完成。參數:adaptive_hash_index

4)LogBuffer:日志緩沖區,用來保存要寫入到磁盤中的log日志數據(redolog、undolog),默認大小為16MB,日志緩沖區的日志會定期刷新到磁盤中。如果需要更新、插入或刪除許多行的事務,增加日志緩沖區的大小可以節省磁盤1/0。

參數:innodb_log_buffer_size:緩沖區大小

innodb_flush_log_at_trx_commit:日志刷新到磁盤時機

磁盤結構:主要有以下幾部分組成,其特點如下所示:

1)SystemTablespace:系統表空間是更改緩沖區的存儲區域。如果表是在系統表空間而不是每個表文件或通用表空間中創建的,它也可能包含表和索引數據。(在MySQL5.x版本中還包含lnnoDB數據字典、undolog等)參數:innodb_data_file_path

2)File-Per-TableTablespaces:每個表的文件表空間包含單個lnnoDB表的數據和索引,并存儲在文件系統上的單個數據文件中。參數:innodb_file_per_table

3)GeneralTablespaces:通用表空間,需要通過CREATETABLESPACE語法創建通用表空間,在創建表時,可以指定該表空間。

4)UndoTablespaces:撤銷表空間,MySQL實例在初始化時會自動創建兩個默認的undo表空間(初始大小16M),用于存儲undolog日志。

5)Temporary Tablespaces:InnoDB使用會話臨時表空間和全局臨時表空間。存儲用戶創建的臨時表等數據。

6)DoublewriteBufferFiles:雙寫緩沖區,innoDB引擎將數據頁從BufferPool刷新到磁盤前,先將數據頁寫入雙寫緩沖區文件中,便于系統異常時恢復數據。

7)RedoLog:重做日志,是用來實現事務的持久性。該日志文件由兩部分組成:重做日志緩沖(redologbuffer)以及重做日志文件(redolog),前者是在內存中,后者在磁盤中。當事務提交之后會把所有修改信息都會存到該日志中,用于在刷新臟頁到磁盤時,發生錯誤時,進行數據恢復使用。

后臺線程:InnoDB存儲引擎緩沖池中主要有四個后臺線程,它們主要內容如下:

1)Master Thread:核心后臺線程,負責調度其他線程,還負責將緩沖池中的數據異步刷新到磁盤中,保持數據的一致性,還包括臟頁的刷新、合并插入緩存、undo頁的回收。

2)I0 Thread:在lnnoDB存儲引擎中大量使用了AIO來處理IO請求,這樣可以極大地提高數據庫的性能,而IOThread主要負責這些lO請求的回調,線程類型如下所示:

線程類型默認個數職責
Read thread4負責讀操作
Write thread4負責寫操作
Log thread1負責將日志緩沖區刷新到磁盤
Insert buffer thread1負責將寫緩沖區內容刷新到磁盤

3)Purge Thread:主要用于回收事務已經提交了的undolog,在事務提交之后,undolog可能不用了,就用它來回收。

4)Page Cleaner Thread:協助MasterThread刷新臟頁到磁盤的線程,它可以減輕Master Thread的工作壓力,減少阻塞。

事務原理

事務:事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗,其特性如下所示:

1)原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗。

2)一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態。

3)隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行。

4)持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。

這些特性涉及的原理主要分為以下兩者情況:

1)redo log:重做日志,記錄的是事務提交時數據頁的物理修改是用來實現事務的持久性,該日志文件由兩部分組成:重做日志緩沖(redologbuffer)以及重做日志文件(redologfile),前者是在內存中,后者在磁盤中。

當事務提交之后會把所有修改信息都存到該日志文件中,用于在刷新臟頁到磁盤,發生錯誤時,進行數據恢復使用,如下所示:

2)undo log:回滾日志,用于記錄數據被修改前的信息,作用包含兩個:提供回滾和 MVCC(多版本并發控制)。

undo log和redo log記錄物理日志不一樣,它是邏輯日志。可以認為當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,當update一條記錄時,它記錄一條對應相反的update記錄。

當執行rollback時,就可以從undolog中的邏輯記錄讀取到相應的內容并進行回滾,如下所示:

undo log銷毀:undo log在事務執行時產生,事務提交時,并不會立即刪除undo log,因為這些日志可能還用于MVCC。

undo log存儲:undo log采用段的方式進行管理和記錄,存放在前面介紹的rollback segment回滾段中,內部包含1024個undo log segment。

MVCC

MVCC:通過在數據庫中保存多個數據版本,允許讀操作不加鎖,同時寫操作不會阻塞讀取從而提高并發性能,MVCC依賴于事務的快照隔離(Snapshot Isolation)級別,確保每個事務看到的是一致的視圖,對于讀取數據主要分為以下兩種:

1)當前讀:讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖,對于我們日常的操作,如:select...lock in share mode(共享鎖),select...for update、update、insert、delete(排他鎖)都是一種當前讀。

2)快照讀:簡單的select(不加鎖)就是快照讀,快照讀讀取的是記錄數據的可見版本,有可能是歷史數據,不加鎖,是非阻塞讀。

Read Committed:每次select都生成一個快照讀。

Repeatable Read:開啟事務后第一個select語句才是快照讀的地方。

Serializable:快照讀會退化為當前讀。

其實現原理如下圖所示:

MVCC使得讀寫操作沒有沖突,快照讀為MySQL實現MVCc提供了一個非阻塞讀功能,MVCC的具體實現還需要依賴于數據庫記錄中的三個隱式字段、undo log日志、readView,如下:

隱式字段:當我們創建一張表的時候,默認記錄中會有三個隱藏的字段,如下所示:

隱藏字段含義
DB_TRX_ID最近修改事務ID,記錄插入這條記錄或最后一次修改該記錄的事務ID。
DB_ROLL_PTR回滾指針,指向這條記錄的上一個版本,用于配合undolog,指向上一個版本。
DB_ROW_ID隱藏主鍵,如果表結構沒有指定主鍵,將會生成該隱藏字段。

undo log日志:回滾日志,在insert、update、delete的時候產生的便于數據回滾的日志:

當insert的時候,產生的undolog日志只在回滾時需要,在事務提交后,可被立即刪除

當update、delete的時候,產生的undolog日志不僅在回滾時需要,在快照讀時也需要,不會立即被刪除。

不同事務或相同事務對同一條記錄進行修改,會導致該記錄的undo log生成一條記錄版本鏈表,鏈表的頭部是最新的舊記錄,鏈表尾部是最早的舊記錄,如下所示:

readView:readView(讀視圖)是快照讀SQL執行時MVCC提取數據的依據,記錄并維護系統當前活躍的事務(未提交的)id,readView中包含了四個核心字段如下所示:

字段含義
m_ids當前活躍的事務ID集合
min_trx_id最小活躍事務ID
max_trx_id預分配事務ID,當前最大事務ID+1(因為事務ID是自增的)
creator_trx_idReadView創建者的事務ID

版本鏈數據的訪問規則如下所示:

不同的隔離級別,生成的readView的時機不同,如下所示:

1)read committed:在事務中每一次執行快照讀時生成的readView,如下所示:

比如當前我們訪問這條記錄的事務id小于我們的最小活動事務的id,那么就說明當前的這條記錄已經提交了,此時就說明這一次快照讀就是我們當前訪問的這條記錄,如下是DB_TRX_ID為2就是我們要訪問的記錄:

2)repeatable read:僅在事務第一次執行快照讀時生成readView,后續復用該readView

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

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

相關文章

Redis高階5-布隆過濾器

Redis布隆過濾器 ? 由一個初始值都為零的bit數組和多個哈希函數構成,用來快速判斷集合中是否存在某個元素 目的減少內存占用方式不保存數據信息,只是在內存中做一個是否存在的標記flag 布隆過濾器(英語:Bloom Filter&#xff0…

DeepSeek學術題目選擇效果怎么樣?

論文選題 一篇出色的論文背后,必定有一個“智慧的選題”在撐腰。選題足夠好文章就能順利登上高水平期刊;選題不行再精彩的寫作也只能“當花瓶”。然而許多寶子們常常忽視這個環節,把大量時間花在寫作上,選題時卻像抓鬮一樣隨便挑一…

第五節 MATLAB命令

本節的內容將提供常用的一些MATLAB命令。 在之前的篇章中我們已經知道了MATLAB數值計算和數據可視化是一個交互式程序,在它的命令窗口中您可以在MATLAB提示符“>>”下鍵入命令。 MATLAB管理會話的命令 MATLAB提供管理會話的各種命令。如下表所示:…

Docker核心命令與Yocto項目的高效應用

隨著軟件開發逐漸向分布式和容器化方向演進,Docker 已成為主流的容器化技術之一。它通過標準化的環境配置、資源隔離和高效的部署流程,大幅提高了開發和構建效率。Yocto 項目作為嵌入式 Linux 系統構建工具,與 Docker 的結合進一步增強了開發…

Qt 5.14.2 學習記錄 —— ?? QFile和多線程

文章目錄 1、QFile1、打開2、讀寫3、關閉4、程序5、其它功能 2、多線程1、演示2、鎖 3、條件變量和信號量 1、QFile Qt有自己的一套文件體系,不過Qt也可以使用C,C,Linux的文件操作。使用Qt的文件體系和Qt自己的一些類型更好配合。 管理寫入讀…

【全棧】SprintBoot+vue3迷你商城-擴展:vue3項目創建及目錄介紹

【全棧】SprintBootvue3迷你商城-擴展:vue3項目創建及目錄介紹 往期的文章都在這里啦,大家有興趣可以看一下 【全棧】SprintBootvue3迷你商城(1) 【全棧】SprintBootvue3迷你商城(2) 【全棧】SprintBootvu…

使用Aardio庫在Python中創建桌面應用:簡單指南

引言 隨著軟件開發需求的不斷增長,開發者們需要更加靈活和高效的工具來快速構建應用程序。Python以其簡潔易讀的語法和強大的社區支持而聞名,但在創建圖形用戶界面(GUI)時,可能會遇到一些挑戰。Aardio作為一種輕量級的…

多版本并發控制:MVCC的作用和基本原理

多版本并發控制:MVCC的作用和基本原理 1、MVCC簡介1.1 快照讀與當前讀的區別1.1.1 快照讀1.1.2 當前讀 1.2 數據庫的讀寫問題1.3 MVCC的作用 2、MVCC實現原理之ReadView2.1 什么是ReadView2.2 ReadView的設計思路2.3 MVCC整體操作流程 1、MVCC簡介 1.1 快照讀與當前…

神經網絡|(二)sigmoid神經元函數

【1】引言 在前序學習進程中,我們已經了解了基本的二元分類器和神經元的構成,文章學習鏈接為: 神經網絡|(一)加權平均法,感知機和神經元-CSDN博客 在此基礎上,我們認識到神經元本身在做二元分類,是一種非…

Qt中QVariant的使用

1.使用QVariant實現不同類型數據的相加 方法:通過type函數返回數值的類型,然后通過setValue來構造一個QVariant類型的返回值。 函數: QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…

BAHD酰基轉移酶對紫草素的手性催化-文獻精讀105

Two BAHD Acyltransferases Catalyze the Last Step in the Shikonin/Alkannin Biosynthetic Pathway 兩個BAHD酰基轉移酶催化了紫草素/左旋紫草素生物合成途徑中的最后一步 一個BAHD酰基轉移酶專門催化紫草素的酰基化,而另一個BAHD酰基轉移酶則僅催化紫草素的對映…

Avalonia+ReactiveUI跨平臺路由:打造絲滑UI交互的奇幻冒險

一、引言 在當今數字化時代,跨平臺應用開發已成為大勢所趨。開發者們迫切需要一種高效、靈活的方式,能夠讓應用程序在不同操作系統上無縫運行,為用戶提供一致的體驗。Avalonia 和 ReactiveUI 的組合,宛如一對天作之合的舞者&…

CLion開發Qt桌面

IDE:CLion Qt Qt版本:5.12 學習正點原子的嵌入式Linux開發板時,使用Qt Creator寫代碼不是很方便,遂嘗試使用CLion搭建Qt開發環境。 一、CLion的Qt環境搭建 1,配置工具鏈 找到Qt的安裝目錄,此處為E:\Tools\…

【學術會議-第五屆機械設計與仿真國際學術會議(MDS 2025) 】前端開發:技術與藝術的完美融合

重要信息 大會官網:www.icmds.net 大會時間:2025年02月28日-03月02日 大會地點:中國-大連 會議簡介 2025年第五屆機械設計與仿真國際學術會議(MDS 2025) 將于2025年02月28-3月02日在中國大連召開。MDS 2025將圍繞“機械設計”…

《DeepSeek R1:開源大模型的破局者》

驚爆!中國開源大模型震撼登場 在人工智能領域的激烈競爭中,一場震撼全球的技術革命正悄然發生。2025 年 1 月 20 日晚,一家來自中國的人工智能初創公司 ——DeepSeek(深度求索),如同一顆耀眼的新星&#x…

84,【8】BUUCTF WEB [羊城杯 2020]Blackcat

進入靶場 音樂硬控我3分鐘 回去看源碼 <?php // 檢查 POST 請求中是否包含 Black-Cat-Sheriff 和 One-ear 字段 // 如果任意一個字段為空&#xff0c;則輸出錯誤信息并終止腳本執行 if(empty($_POST[Black-Cat-Sheriff]) || empty($_POST[One-ear])){die(請提供 Black-C…

人工智能:從基礎到前沿

目錄 目錄 1. 引言 2. 人工智能基礎 2.1 什么是人工智能&#xff1f; 2.2 人工智能的歷史 2.3 人工智能的分類 3. 機器學習 3.1 機器學習概述 3.2 監督學習 3.3 無監督學習 3.4 強化學習 4. 深度學習 4.1 深度學習概述 4.2 神經網絡基礎 4.3 卷積神經網絡&#…

漏洞情報:為什么、要什么和怎么做

漏洞一直是網絡攻防的焦點所在&#xff0c;因為漏洞直接或間接影響安全性的核心方面——權限。攻擊者挖掘和利用漏洞&#xff0c;獲取非授權的權限&#xff1b;防御方定位和消除漏洞&#xff0c;監測和阻斷漏洞的利用&#xff0c;使攻擊者無法利用漏洞達到其目的。漏洞信息本質…

leetcode——刪除鏈表的倒數第N個節點(java)

給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 輸入&#xff1a;head [1], n 1 輸出&#xff1a;[] 示例 3&#xf…

正則表達式以及Qt中的使用

目錄 一、正則表達式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .運算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重復次數&#xff1a; 2.4 量詞{} 2.5 特征標群() 2.6 或運算符 2.7 \反斜線轉碼特殊字符 2.8 錨點 3、簡寫字符 4、零寬度斷言 4.1 正…