真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

InnoDB存儲引擎

成都創(chuàng)新互聯(lián)公司是專業(yè)的濉溪網(wǎng)站建設(shè)公司,濉溪接單;提供網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行濉溪網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

InnoDB是在MySQL存儲引擎中第一個完整支持ACID事務(wù)的引擎,該引擎之前由Innobase OY公司所開發(fā),后來該公司被Oracle收購。InnoDB是MySQL數(shù)據(jù)庫中使用最廣泛的存儲引擎,已被許多大型公司所采用,如Google、Facebook、YouTube等,如果使用MySQL數(shù)據(jù)庫服務(wù),沒有特殊的要求下,InnoDB是不二之選。


1.InnoDB體系架構(gòu)

需要深入了解InnoDB先從了解InnoDB的體系架構(gòu)開始,如下圖所示:

InnoDB存儲引擎

InnoDB存儲引擎有多個內(nèi)存塊,可以認為這些內(nèi)存塊組成了一個大的內(nèi)存池,負責以下幾個工作:

維護所有進程/線程,需要訪問的多個內(nèi)部數(shù)據(jù)結(jié)構(gòu);

緩存磁盤上的數(shù)據(jù),方便快速地讀取,同時在對磁盤文件的數(shù)據(jù)修改之前在這里緩存;

重做日志(redo log)緩沖(簡單來講,redo log記錄的是事務(wù)所對應(yīng)的數(shù)據(jù)更新日志,用于降低每次數(shù)據(jù)變更都產(chǎn)生的磁盤IO,該日志由工作線程定時把數(shù)據(jù)的更新內(nèi)容定時刷新到磁盤中去,當數(shù)據(jù)庫奔潰時數(shù)據(jù)還沒來得及刷新到磁盤,重新啟動運行是則可以從redo log里面重新提取刷新到磁盤,具體有關(guān)redo log在后面相關(guān)章節(jié)會詳細介紹)。

后臺線程的主要作用是負責刷新內(nèi)存池中的數(shù)據(jù),保證緩沖池中的內(nèi)存緩沖的是最近的數(shù)據(jù),此外除將已修改的數(shù)據(jù)文件刷新到磁盤中,同時保證在數(shù)據(jù)庫發(fā)生異常的情況下InnoDB能恢復(fù)到正常運行狀態(tài)。

2.后臺線程

master thread

master thread是一個非常核心的后臺線程,主要負責將緩沖池中的數(shù)據(jù)異步刷新到磁盤,保證數(shù)據(jù)的一致性,包括臟頁面的刷新、合并插入緩沖、undo頁的回收等。

io thread

在InnoDB引擎中大量使用了AIO(Async IO)來處理寫IO請求,這樣可以極大提高數(shù)據(jù)庫的性能。而io thread的主要工作就是負責這些IO請求的回調(diào)處理??梢允褂妹?code>show engine innodb status\G來觀察io threa。

InnoDB存儲引擎

圖片來自廣東睿江云

從上圖可以看到,有1個insert buffer線程;1個log線程;4個read線程;4個write線程。

purge thread

事務(wù)被提交后,其所使用的undo log(用于事務(wù)commit失敗后回滾操作用)可能不在需要,因此需要purge線程來回收undo頁。在InnoDB 1.1版本之前,purge thread在master thread中完成;而從InnoDB 1.1版本開始,purge操作獨立到專門的線程執(zhí)行,以減輕master thread壓力,提升cpu使用率、提升引擎性能;從InnoDB 1.2版本開始,還支持多個purge thread以進一步加快undo頁回收。

page cleaner thread

在InnoDB 1.2.x版本中引入,其作用是將之前版本中臟頁面是刷新操作都放在獨立的線程中完成,也是為了減輕master thread的壓力,提升性能。

3.內(nèi)存

緩沖池

InnoDB引擎的數(shù)據(jù)存儲是基于磁盤的,把記錄按照一定的格式記錄在磁盤,但是由于CPU與磁盤的速度有較大的差別,因此引入了基于內(nèi)存緩沖技術(shù)來提高數(shù)據(jù)庫的性能。簡單來講,把要讀取數(shù)據(jù)的磁盤內(nèi)容先加載到內(nèi)存緩沖區(qū)域,下次讀取同樣數(shù)據(jù)時先判斷是否被緩沖區(qū)所緩存,如果緩存則從緩沖區(qū)讀取內(nèi)容;同樣,當需要對數(shù)據(jù)進行修改時,不直接修改磁盤對應(yīng)數(shù)據(jù),而是先修改緩沖區(qū)域,然后通過一種叫checkpoint(具體后面會介紹)的機制把更新的數(shù)據(jù)刷新到磁盤。

因此對于InnoDB引擎來講,緩沖池的設(shè)置變得尤其重要,可以通過innodb_buffer_pool_size參數(shù)進行設(shè)置。

雖然緩沖池是為了緩沖數(shù)據(jù),但是緩沖池保存的數(shù)據(jù)類型不僅僅只有數(shù)據(jù)庫的記錄,有以下幾種類型:索引頁、數(shù)據(jù)頁、undo頁、插入緩沖(insert buffer)、自適應(yīng)哈希索引、InnoDB存儲的鎖信息(lock info)、數(shù)據(jù)字典信息等。

從InnoDB 1.0.x版本開始,允許有多個緩沖池實例,每個頁根據(jù)哈希值平均分配到不同緩沖池實例中,這樣可以增加數(shù)據(jù)庫的并發(fā)處理。具體多實例緩沖池本文不再詳細展開描述,有興趣者可以繼續(xù)通過其它途徑深入了解。

內(nèi)存管理 LRU List、Free List、Flush List 

通常來說,數(shù)據(jù)庫中的內(nèi)存緩沖區(qū)是通過LRU(Latest Recent Used,最近最少使用)算法來進行管理。即頻繁使用的頁在LRU列表的前端,而最少使用的頁在LRU的尾端。當緩沖池不能存放新讀取到的頁時,將首先釋放LRU列表尾端的頁。

在InnoDB引擎中,緩沖池中頁的大小默認是16KB,同樣也是使用LRU算法來進行管理,稍有不同的是,引擎對傳統(tǒng)的LRU算法進行了一些優(yōu)化,當讀取到新的頁,但并不是直接插入到LRU列表的首部,而是插入到LRU列表的midpoint位置,這個位置可以通過參數(shù)innodb_old_blocks_pct控制,默認情況下這個數(shù)值是37,代表插入到LRU列表尾部的37%的位置。關(guān)于InnoDB下LRU的算法不在本文詳細講解,有興趣的讀者可以自行查閱相關(guān)資料。

介紹完LRU List,下面介紹Free List,F(xiàn)ree列表保存的是空閑頁,引擎需要從緩沖池中分頁時,首先從Free列表中查找是否有空閑頁,若有則把頁從Free List獲取然后刪除放到LRU List中,同理當LRU List的頁面需要淘汰時則重新加入到Free List。

在LRU列表中的頁被修改后,程該頁為臟頁(dirty page),即緩沖池中的頁和磁盤上的頁數(shù)據(jù)產(chǎn)生了不一致,這時候數(shù)據(jù)庫會通過checkpoint機制將臟頁刷新回磁盤(關(guān)于checkpoint在下一節(jié)會介紹),而Flush List則是專門保存這些臟頁的列表。

redo log重做日志

InnoDB存儲引擎的內(nèi)存區(qū)域除了緩沖池外,還有重做日志緩沖(redo log buffer)。InnoDB存儲引擎首先將日志信息先放入到這個緩沖區(qū),然后按一定的頻率刷新到redo log文件中。在后面“文件”一章會詳細描述各自文件及其作用,其中就包含了redo log,這里先不做過多的講解。

額外的內(nèi)存池

額外的內(nèi)存池記錄的是數(shù)據(jù)庫內(nèi)部需要用到的各種數(shù)據(jù)結(jié)構(gòu),比如記錄緩沖池信息的、記錄LRU、鎖等,這塊往往也會被忽略。

4.checkpoint

在前面的小結(jié)描述過,緩沖池設(shè)計的目的是為了協(xié)調(diào)CPU速度與磁盤速度的鴻溝,頁的所有操作首先都是在緩沖池中完成的,如一條update、delete、insert語句改變了頁中的記錄,那么此時此頁是臟的,數(shù)據(jù)庫需要把頁的數(shù)據(jù)更新到磁盤中。
如果每一次變化都立刻更新到磁盤,那么這個效率會非常大,也失去了緩沖池的意義,但是如果長時間不刷新又會導(dǎo)致數(shù)據(jù)庫崩潰時刻無法及時把數(shù)據(jù)更新到磁盤而出現(xiàn)數(shù)據(jù)的不一致性。

為了避免這些問題,當前事務(wù)型的數(shù)據(jù)庫普遍都采用了wirte ahead log的策略,即當事務(wù)提交的時候,先寫redo log,再修改頁,如果期間發(fā)生宕機了可以通過redo log進行數(shù)據(jù)恢復(fù)。

checkpoint技術(shù)就是用于記錄redo log里面,那些log已經(jīng)刷新到磁盤了,那些log還沒刷新,在InnoDB引擎里面,其checkpoint標記是通過一個叫LSN(log sequence number)來標記,LSN是一個8字節(jié)的數(shù)字,LSN之前的log都是已經(jīng)被刷新到磁盤了,之后都是未被刷新的,所以當數(shù)據(jù)庫宕機恢復(fù)的時候,只需要把LSN之后的redo log進行刷新即可。

5.InnoDB關(guān)鍵特性

InnoDB存儲引擎的關(guān)鍵特性包括:

插入緩沖(insert buffer)

兩次寫(double write)

自適應(yīng)哈希索引(adaptive hash index)

異步io(async io)

刷新鄰接頁(flush neighbor page)


下面只選取其中一些比較好理解的特性來簡單介紹,其他比較復(fù)雜的如插入緩沖、自適應(yīng)哈希索引留待讀者自行去做詳細的研究。

兩次寫

顧名思義,就是寫兩次的意思,在InnoDB引擎中,有個叫共享表空間,這個空間可以存放一些共享的數(shù)據(jù),比如索引等信息,當數(shù)據(jù)庫需要把一個緩沖池的頁刷新到磁盤時,先把頁數(shù)據(jù)寫入到共享表空間,然后再寫入磁盤,當寫入磁盤發(fā)現(xiàn)異常導(dǎo)致數(shù)據(jù)丟失了,這時候從共享表空間把數(shù)據(jù)恢復(fù)重新寫入磁盤。

異步io

簡單來講,異步io就是把io操作變成異步的方式,比如需要對磁盤進行讀寫,則先發(fā)起一個io操作,等待磁盤讀寫完成后再通知上層進行處理,異步io還有一個好處是可以對一些io操作進行合并優(yōu)化,比如可以對連續(xù)頁的請求進行合并成一次請求等。

刷新鄰接頁

這個也是比較好理解的,就是當刷新一個臟頁時,InnoDB存儲引擎會檢測該頁所在的區(qū)的所有頁,如果都是臟頁,那么一起進行刷新,可以借助異步io進行多個寫操作的合并,提升效率。


新聞名稱:InnoDB存儲引擎
URL網(wǎng)址:http://weahome.cn/article/ieodcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部