3分鐘了解InnoDB的讀寫緩沖

緩沖池

存放表數(shù)據(jù)和索引數(shù)據(jù)沦辙,把磁盤上的數(shù)據(jù)加載到緩沖池司浪,避免每次訪問都進(jìn)行磁盤I/O消痛,加速訪問

緩沖池的數(shù)據(jù)管理

最常用的就是LRU算法且叁,redis、memcache秩伞、OS都會用逞带,但是MySQL不一樣

傳統(tǒng)的LRU算法

最常見的玩法是:有一個(gè)列表,新訪問的數(shù)據(jù)放在頭部纱新,空間不足時(shí)展氓,淘汰末尾元素。

例如:

假設(shè)我們訪問的數(shù)據(jù)脸爱,在編號為3的頁中:

編號3的頁在隊(duì)列中遇汞,移動到隊(duì)列頭,沒有頁被淘汰

接下來簿废,假設(shè)我們要訪問編號15的頁

因?yàn)榫幪枮?5的頁不在隊(duì)列中空入,在隊(duì)列頭插入,編號9的頁被淘汰

傳統(tǒng)的LRU簡單直觀族檬,為什么MySQL沒有直接使用呢歪赢?

因?yàn)椋琈ySQL有兩類操作會出現(xiàn)問題:

  1. 預(yù)讀
    預(yù)讀是一種將多個(gè)頁讀取到緩沖池的I/O請求导梆,預(yù)測這些頁很快會被訪問轨淌。實(shí)際應(yīng)用中,這些頁可能并不會訪問
  2. 全表掃描
    mysqldump或者全表查詢會導(dǎo)致加載大量數(shù)據(jù)看尼,大量的熱點(diǎn)數(shù)據(jù)被驅(qū)逐递鹉,導(dǎo)致性能急劇下降

該如何優(yōu)化呢?

  1. 讓非熱點(diǎn)數(shù)據(jù)頁停留時(shí)間盡可能短
  2. 讓真正需要的頁才移動到頭部

MySQL的中點(diǎn)插入LRU

針對預(yù)讀的問題藏斩,解決思路是:

  1. 將LRU列表分成兩部分躏结,新頁列表和舊頁列表
  2. 新頁列表尾部與舊頁列表頭部相連
  3. 新訪問的頁會在舊頁列表頭部插入

這樣,預(yù)讀的頁如果不被訪問狰域,就不會進(jìn)入新頁列表媳拴,并且很快老化而被驅(qū)逐

例如:

假設(shè)黄橘,我們通過預(yù)讀加載了編號37的頁:

編號為37的頁插入到舊頁列表頭部,同時(shí)淘汰了編號23的頁

接下來屈溉,假設(shè)我們讀操作需要訪問的數(shù)據(jù)在編號37的頁中:

編號為37的頁移動到新頁列表頭部塞关,編號為7的頁從新頁列表尾部移動到舊頁列表頭部

對于全表掃描,這些措施還不夠子巾,因?yàn)橐粋€(gè)數(shù)據(jù)也可能被連續(xù)訪問幾次帆赢,該怎么改進(jìn)呢?
MySQL增加停留時(shí)間窗機(jī)制线梗,即在時(shí)間T內(nèi)椰于,不論訪問多少次,都不會移動到新頁列表

上述算法仪搔,對應(yīng)哪些參數(shù)呢瘾婿?

  • innodb_old_blocks_pct
    舊頁列表的比例,默認(rèn)是37烤咧,即占3/8偏陪。取值范圍是5~95,如果設(shè)置成95髓削,算法就近似于傳統(tǒng)的LRU
  • innodb_old_blocks_time
    舊頁列表停留時(shí)間竹挡,單位ms,默認(rèn)1000立膛。數(shù)據(jù)首次訪問并且停留時(shí)間超過配置揪罕,才能進(jìn)入新頁列表

變更緩沖

對于讀請求,緩沖區(qū)能夠減少I/O次數(shù)宝泵,從而提升性能好啰,那么對于寫請求呢?

對于寫請求存在兩種場景:

  • 情況一:修改的頁恰好在緩沖區(qū)
    1. 直接修改頁儿奶,一次內(nèi)存操作
    2. 請求寫入重做日志框往,一次順序?qū)?/li>
  • 情況二: 修改的數(shù)據(jù)還沒有加載到緩沖池
    1. 讀取磁盤,將索引數(shù)據(jù)加載到緩沖區(qū)闯捎,一次隨機(jī)讀
    2. 修改頁椰弊,一次內(nèi)存操作
    3. 請求寫入重做日志,一次順序?qū)?/li>

因此瓤鼻,如果沒有命中緩沖區(qū)秉版,那么會出現(xiàn)一次隨機(jī)I/O,對于寫多讀少的場景茬祷,是否還有優(yōu)化的空間呢清焕?
答案就是變更緩沖。

什么是變更緩沖呢?

變更緩沖區(qū)是緩沖池的一部分秸妥,存儲對未加載到緩沖池的輔助索引的修改滚停。等到數(shù)據(jù)被讀取時(shí),在將數(shù)據(jù)合并到緩沖池粥惧。如圖:

因此上述的第二種情況修改成:

  1. 數(shù)據(jù)寫入變更緩沖键畴,一次內(nèi)存操作
  2. 請求寫入重做日志,一次順序?qū)?/li>

雖然首次加載數(shù)據(jù)時(shí)影晓,會多一次內(nèi)存操作镰吵,即合并變更緩沖內(nèi)的變更記錄檩禾,但是相比于一次磁盤I/O挂签,開銷可以忽略不計(jì)

如何保證數(shù)據(jù)一致性?

  1. 變更緩沖不僅僅是內(nèi)存的一塊區(qū)域盼产,也會定期寫入系統(tǒng)表空間
  2. 在加載索引時(shí)饵婆,會有合并機(jī)制,保證緩沖池中的索引數(shù)據(jù)是最新的

配置參數(shù)

  • innodb_change_buffering
    變更緩沖的開關(guān)戏售,默認(rèn)支持全部類型操作侨核。none、inserts灌灾、deletes搓译、changes、purges锋喜、all
  • innodb_change_buffer_max_size
    變更緩沖占緩沖池的百分比些己。默認(rèn)是25,最大50
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘿般,一起剝皮案震驚了整個(gè)濱河市段标,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炉奴,老刑警劉巖逼庞,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞻赶,居然都是意外死亡赛糟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門砸逊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璧南,“玉大人,你說我怎么就攤上這事痹兜∧赂溃” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長对湃。 經(jīng)常有香客問我崖叫,道長,這世上最難降的妖魔是什么拍柒? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任心傀,我火速辦了婚禮,結(jié)果婚禮上拆讯,老公的妹妹穿的比我還像新娘脂男。我一直安慰自己,他們只是感情好种呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布宰翅。 她就那樣靜靜地躺著,像睡著了一般爽室。 火紅的嫁衣襯著肌膚如雪汁讼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天阔墩,我揣著相機(jī)與錄音嘿架,去河邊找鬼。 笑死啸箫,一個(gè)胖子當(dāng)著我的面吹牛耸彪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忘苛,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蝉娜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柑土?” 一聲冷哼從身側(cè)響起蜀肘,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稽屏,沒想到半個(gè)月后扮宠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狐榔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年坛增,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄腻。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡收捣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庵楷,到底是詐尸還是另有隱情罢艾,我是刑警寧澤楣颠,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站咐蚯,受9級特大地震影響童漩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜春锋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一矫膨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧期奔,春花似錦、人聲如沸呐萌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渠旁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間船逮,已是汗流浹背顾腊。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挖胃,地道東北人杂靶。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像酱鸭,于是被迫代替她去往敵國和親吗垮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • lnnoDB是事務(wù)安全的MySQL存儲引擎凹髓, 設(shè)計(jì)上采用了類似于Oracle數(shù)據(jù)庫的架構(gòu)烁登。 通常來說,InnoD...
    好好學(xué)習(xí)Sun閱讀 1,479評論 0 5
  • InnoDB體系架構(gòu) 上圖簡單顯示了InnoDB存儲引擎的體系架構(gòu)圖中可見蔚舀,InnoDB存儲引擎有多個(gè)內(nèi)存塊饵沧,可以...
    Rick617閱讀 4,018評論 0 6
  • 第一章 MySQL 體系架構(gòu)和存儲引擎 mysql是數(shù)據(jù)庫也是數(shù)據(jù)庫實(shí)例 mysql 是一個(gè)單進(jìn)程多線程架構(gòu)的數(shù)據(jù)...
    snail_knight閱讀 3,492評論 0 6
  • 應(yīng)用系統(tǒng)分層架構(gòu),為了加速數(shù)據(jù)訪問赌躺,會把最常訪問的數(shù)據(jù)狼牺,放在緩存(cache)里,避免每次都去訪問數(shù)據(jù)庫礼患。 操作系...
    小鳥筑成巢閱讀 428評論 0 1
  • 六點(diǎn)十分打電話給山腳下的網(wǎng)紅面館訂了一碗素面拂到,六點(diǎn)二十進(jìn)門時(shí)面條正好上桌。我對于這家面館是另一個(gè)原因码泞,知道我每次...
    海云道人閱讀 282評論 0 1