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