更新時間:2021-01-14 17:10:06 來源:動力節點 瀏覽1083次
InnoDB存儲引擎是MySQL眾多存儲引擎中非常特別的一個,其特點是行鎖設計、支持MVCC、支持外鍵、提供一致性非鎖定讀、同時被設計用來最有效的利用以及使用內存和CPU。從Mysql5.5版本開始,InnoDB是默認的表存儲引擎,本文我們就來詳細聊聊InnoDB存儲引擎。
一、InnoDB的體系架構
InnoDB存儲引擎有多個內存塊,這些內存塊組成了一個大的內存池。后臺線程主要負責刷新內存池中的數據、將已修改的數據刷新到磁盤等等。
InnoDB后臺有多個不同的線程,用來負責不同的任務。主要有如下:
1.Master Thread
這是最核心的一個線程,主要負責將緩沖池中的數據異步刷新到磁盤,保證數據的一致性,包括贓頁的刷新、合并插入緩沖、UNDO 頁的回收等.
2.IO Thread
在 InnoDB 存儲引擎中大量使用了異步 IO 來處理寫 IO 請求, IO Thread 的工作主要是負責這些 IO 請求的回調處理。
3.Purge Thread
事務被提交之后, undo log 可能不再需要,因此需要 Purge Thread 來回收已經使用并分配的 undo頁. InnoDB 支持多個 Purge Thread, 這樣做可以加快 undo 頁的回收。
4.Page Cleaner Thread
Page Cleaner Thread 是在InnoDB 1.2.x版本新引入的,其作用是將之前版本中臟頁的刷新操作都放入單獨的線程中來完成,這樣減輕了 Master Thread 的工作及對于用戶查詢線程的阻塞。
InnoDB 存儲引擎是基于磁盤存儲的,也就是說數據都是存儲在磁盤上的,由于 CPU 速度和磁盤速度之間的鴻溝, InnoDB 引擎使用緩沖池技術來提高數據庫的整體性能。緩沖池簡單來說就是一塊內存區域。在數據庫中進行讀取頁的操作,首先將從磁盤讀到的頁存放在緩沖池中,下一次讀取相同的頁時,首先判斷該頁是不是在緩沖池中,若在,稱該頁在緩沖池中被命中,直接讀取該頁。否則,讀取磁盤上的頁。
二、InnoDB的關鍵特性
Insert Buffer是InnoDB存儲引擎關鍵特性中最令人激動與興奮的一個功能。不過這個名字可能會讓人認為插入緩沖是緩沖池中的一個組成部分。其實不然,InnoDB緩沖池中有Insert Buffer信息固然不錯,但是Insert Buffer和數據頁一樣,也是物理頁的一個組成部分。一般情況下,主鍵是行唯一的標識符。通常應用程序中行記錄的插入順序是按照主鍵遞增的順序進行插入的。因此,插入聚集索引一般是順序的,不需要磁盤的隨機讀取。因為,對于此類情況下的插入,速度還是非常快的。
如果說插入緩沖是為了提高寫性能的話,那么兩次寫是為了提高可靠性。其原理是這樣的:
1)當刷新緩沖池臟頁時,并不直接寫到數據文件中,而是先拷貝至內存中的兩次寫緩沖區。
2)接著從兩次寫緩沖區分兩次寫入磁盤共享表空間中,每次寫入1MB。
3)待第2步完成后,再將兩次寫緩沖區寫入數據文件。
三、InnoDB的CheckPoint技術
CheckPoint技術是用來解決如下幾個問題:
1.縮短數據庫恢復時間
2.緩沖池不夠用時,將臟頁刷新到磁盤
3.重做日志不可用時,刷新臟頁
縮短數據庫恢復時間,重做日志中記錄了的checkpoint的位置,這個點之前的頁已經刷新回磁盤,只需要對checkpoint之后的重做日志進行恢復。這樣就大大縮短了恢復時間。緩沖池不夠用時,根據LRU算法,溢出最近最少使用的頁,如果頁為臟頁,強制執行checkpoint,將臟頁刷新回磁盤。
不得不提的是InnoDB存儲引擎作為MySQL的默認存儲引擎,與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容事務(Transaction)功能,類似于PostgreSQL。想要深入了解InnoDB存儲引擎的小伙伴,快來觀看本站的MySQL教程吧!
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習