日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

InnoDB

InnoDB 是由 Innobase Oy 公司開發(fā),該存儲(chǔ)引擎是第一個(gè)完整支持 ACID 事務(wù)的 MySQL 存儲(chǔ)引擎。具有插入緩存、兩次寫、自適應(yīng)哈希索引等關(guān)鍵特性,是一個(gè)高性能、高可用的存儲(chǔ)引擎。

整體架構(gòu)

InnoDB 有多個(gè)內(nèi)存塊,這些內(nèi)存塊組合在一起組成了一個(gè)大的內(nèi)存池。而 InnoDB 的內(nèi)存池中會(huì)有多個(gè)后臺(tái)線程,這些后臺(tái)線程負(fù)責(zé)刷新內(nèi)存池中的數(shù)據(jù),和將臟頁(yè)(已修改的數(shù)據(jù)頁(yè))刷新到磁盤文件。

后臺(tái)線程

默認(rèn)情況下,InnoDB 存儲(chǔ)引擎有 13 個(gè)后臺(tái)線程:

  • 一個(gè) master 線程
  • 一個(gè)鎖監(jiān)控線程
  • 一個(gè)錯(cuò)誤監(jiān)控線程
  • 十個(gè) IO 線程
    • 插入緩存線程
    • 日志線程
    • 讀線程(默認(rèn) 4 個(gè))
    • 寫線程(默認(rèn) 4 個(gè))

下面是我本機(jī)上的十個(gè) IO 線程

內(nèi)存池

InnoDB 存儲(chǔ)引擎的內(nèi)存池包含:緩沖池、日志緩存池、額外內(nèi)存池。這些內(nèi)存的大小分別由配置文件中的參數(shù)決定。其中占比最大的是緩沖池,里面包含了數(shù)據(jù)緩存頁(yè)、索引、插入緩存、自適應(yīng)哈希索引、鎖信息和數(shù)據(jù)字典。InnoDB 會(huì)在讀取數(shù)據(jù)庫(kù)數(shù)據(jù)的時(shí)候,將數(shù)據(jù)緩存到緩沖池中,而在修改數(shù)據(jù)的時(shí)候,會(huì)先把緩沖池中的數(shù)據(jù)修改掉,一旦修改過的數(shù)據(jù)頁(yè)就會(huì)被標(biāo)記為臟頁(yè),而臟頁(yè)則會(huì)被 master 線程按照一定的頻率刷新到磁盤中。日志緩存則是緩存了redo-log 信息,然后再刷新到 redo-log 文件中。額外內(nèi)存池則是在對(duì)一些數(shù)據(jù)結(jié)構(gòu)本身分配內(nèi)存時(shí)會(huì)從額外內(nèi)存池中申請(qǐng)內(nèi)存,當(dāng)該區(qū)域內(nèi)存不足則會(huì)到緩沖池中申請(qǐng)。

淺析 InnoDB 存儲(chǔ)引擎的工作流程

 

Master Thread

InnoDB 存儲(chǔ)引擎的主要工作都在一個(gè)單獨(dú)的 Master Thread 中完成,其內(nèi)部由四個(gè)循環(huán)體構(gòu)成:主循環(huán)( loop )、后臺(tái)循環(huán)( background loop )、刷新循環(huán)( flush loop )、暫停循環(huán)( suspend loop )。具體工作流程如下圖所示:

淺析 InnoDB 存儲(chǔ)引擎的工作流程

 

主循環(huán)

主要負(fù)責(zé)將緩沖池中的日志文件刷新到磁盤中、合并插入緩存、刷新緩沖池中的臟頁(yè)數(shù)據(jù)到磁盤中、刪除無(wú)用的 Undo 頁(yè)、產(chǎn)生一個(gè) checkpoint 。在主循環(huán)中會(huì)多次將臟頁(yè)刷新到磁盤中,但是有一些刷新任務(wù)總會(huì)執(zhí)行,有一些則根據(jù)參數(shù)來判斷當(dāng)前是否需要刷新。而這個(gè)參數(shù) innodb_max_dirty_pages_pct 最大臟頁(yè)比例是通過配置文件決定的,你可以根據(jù)實(shí)際情況來調(diào)整你自己的最大臟頁(yè)比例,來達(dá)到最好的性能。

偽代碼如下:

后臺(tái)循環(huán)

在后臺(tái)循環(huán)中 InnoDB 會(huì)做這些事:刪除無(wú)用的Undo頁(yè)、合并插入緩存。如果當(dāng)前 InnoDB 處于空閑狀態(tài),則跳轉(zhuǎn)到刷新循環(huán),否則跳轉(zhuǎn)到主循環(huán)繼續(xù)處理數(shù)據(jù)。

偽代碼如下:

刷新循環(huán)

一旦執(zhí)行到刷新循環(huán),InnoDB 會(huì)一直處理臟頁(yè)數(shù)據(jù),直到臟頁(yè)數(shù)據(jù)達(dá)到最大臟頁(yè)比例以下。這時(shí)候會(huì)跳轉(zhuǎn)到暫停循環(huán)中(所有數(shù)據(jù)都處理完畢)。

偽代碼如下:

暫停循環(huán)

在本循環(huán)中,InnoDB會(huì)將 Master Thread 掛起,減少內(nèi)存資源使用,一直處于 waiting 狀態(tài),等待事件來喚醒。一旦有新的事件過來,就跳轉(zhuǎn)到主循環(huán)中。

偽代碼如下:


由此可以看出,master 線程的最大的工作內(nèi)容就是刷新臟頁(yè)數(shù)據(jù)到磁盤了。這一步就是把緩存池中被修改的數(shù)據(jù)頁(yè)同步到磁盤中。而臟頁(yè)數(shù)據(jù)的刷新基本上都是由innodb_max_dirty_pages_pct 來控制的,所以當(dāng)你的服務(wù)器處理能力比較強(qiáng),給 InnoDB 分配的內(nèi)存池比較大,這時(shí)候可能你的臟頁(yè)數(shù)據(jù)會(huì)很難達(dá)到最大臟頁(yè)比,這時(shí)候你的數(shù)據(jù)基本上都在緩沖池中,可能需要很長(zhǎng)一段時(shí)間才會(huì)到數(shù)據(jù)庫(kù)磁盤文件中,也就是臟頁(yè)的刷新速度會(huì)很低(MySQL 5.1之前的版本默認(rèn)是 90%,后面調(diào)整到 75%)。所以實(shí)際應(yīng)用中可以根據(jù)自己內(nèi)存和數(shù)據(jù)庫(kù)的讀寫量來設(shè)置這個(gè)最大臟頁(yè)比。對(duì)于一次刷新臟頁(yè)數(shù)量的設(shè)置,在 InnoDB Plugin 中有一個(gè)參數(shù) innodb_adaptive_flushing自適應(yīng)刷新,InnoDB 會(huì)根據(jù)產(chǎn)生的重做日志速度來計(jì)算出當(dāng)前最適合的刷新臟頁(yè)數(shù)量。當(dāng)然 InnoDB Plugin 中還有其它很多參數(shù)配置,合理利用這些配置可以極大的提升 InnoDB 存儲(chǔ)引擎的性能。

關(guān)鍵特性

前面說到 InnoDB 的三大特性分別為:插入緩存、兩次寫、自適應(yīng)哈希索引。下面就簡(jiǎn)單介紹下這三大特性。

插入緩存

當(dāng)我插入一條數(shù)據(jù),該數(shù)據(jù)只有一個(gè) ID 索引(聚集索引:數(shù)據(jù)行的物理順序與列值的邏輯順序相同)的時(shí)候,并且 ID 是自增長(zhǎng)的,這時(shí)候頁(yè)中的行記錄按照 ID 順序存放,所以只需要在最新頁(yè)插入數(shù)據(jù)即可。但是如果我的表有多個(gè)非聚集索引(該索引中索引的邏輯順序與磁盤上行的物理存儲(chǔ)順序不同),在插入的時(shí)候非聚集索引的插入不再是順序的,這時(shí)候要離散的訪問非聚集索引頁(yè),導(dǎo)致插入性能變低。而插入緩存則在插入的時(shí)候判斷緩沖池中是否存在當(dāng)前非聚集索引,如果存在則直接插入,否則先插入到一個(gè)緩存區(qū),然后再通過 Master Thread 來合并插入緩存。這樣極大的提高了數(shù)據(jù)的寫性能。

兩次寫

兩次寫是為了解決在將緩沖池中的臟頁(yè)刷新到磁盤的過程中,操作系統(tǒng)出現(xiàn)故障,導(dǎo)致當(dāng)前的臟頁(yè)部分寫失效的問題。通過兩次寫在下次恢復(fù)的時(shí)候,InnoDB 會(huì)根據(jù)兩次寫的結(jié)果來恢復(fù)數(shù)據(jù)。

原理:在刷新臟頁(yè)的時(shí)候,不是直接把臟頁(yè)數(shù)據(jù)刷新到磁盤,而是將臟頁(yè)先寫到一個(gè)大小為2M的內(nèi)存緩存中,再將這個(gè)內(nèi)存緩存數(shù)據(jù)同步到磁盤的共享表空間中。當(dāng)全部都寫到共享表空間后,再將數(shù)據(jù)刷新到磁盤中。這樣如果發(fā)生了上面描述的情況,這時(shí)候數(shù)據(jù)會(huì)在共享表空間中有個(gè)備份,恢復(fù)的時(shí)候就可以使用共享表空間的數(shù)據(jù)。

如果有數(shù)據(jù)庫(kù)集群的情況下,master數(shù)據(jù)庫(kù)是一定要開啟兩次寫的,為了保證數(shù)據(jù)可靠性。而從數(shù)據(jù)庫(kù)可以通過參數(shù) skip_innodb_doublewrite 來禁止兩次寫功能,來提高插入效率。

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

InnoDB 會(huì)監(jiān)控對(duì)表示的索引查找,如果發(fā)現(xiàn)可以通過對(duì)索引進(jìn)行哈希來優(yōu)化搜索。這時(shí)候會(huì)對(duì)當(dāng)前的索引建立哈希索引。稱之為自適應(yīng)哈希索引( AHI )。可以通過參數(shù)innodb_adaptive_hash_index 來禁用或啟用此特性。

小結(jié)

總體來說 InnoDB 的高性能體現(xiàn)在:插入數(shù)據(jù)的時(shí)候先保存在內(nèi)存中,直接跟內(nèi)存交互性能比較好,而且還有插入緩存優(yōu)化,保證了高并發(fā)寫操作。高可用則表現(xiàn)在兩次寫特性,保證了機(jī)器宕機(jī)或者出故障的時(shí)候數(shù)據(jù)不會(huì)丟失。這里只是簡(jiǎn)單介紹了一下 InnoDB 的工作流程和一些特性,當(dāng)然 InnoDB 還有很多很多強(qiáng)大的功能,比如說事務(wù)、鎖、索引、算法等等有興趣的同學(xué)可以參考《 MySQL 技術(shù)內(nèi)幕 InnoDB 存儲(chǔ)引擎》這本書深入了解。

分享到:
標(biāo)簽:InnoDB
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定