MySQL 改進(jìn)的LRU算法

1 概述

(本文屬于閱讀筆記术荤,基本上翻譯 MySQL reference 15.5.1 Buffer Pool

在MySQL reference介紹InnoDB內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)中介紹了緩沖池的改進(jìn)LRU算法沈善,MySQL使用列表來實(shí)現(xiàn)緩沖池蹦疑。當(dāng)緩沖池空間不夠時(shí)张漂,緩沖池中最近最少被使用的頁(yè)會(huì)被淘汰罗晕,新的頁(yè)會(huì)被加入到列表的中間位置误褪。采用中間插入(midpoint悉患,注意這里雖然說是中間,但是不一定是嚴(yán)格的中間位置挡鞍,比如默認(rèn)配置下酌泰,該位置從表頭計(jì)算為列表5/8的位置)的策略使得列表被分成了如下兩個(gè)子列表:

  • 在表頭保存的是最近被訪問的新("young")頁(yè)子表。
  • 在表尾是最近沒有被訪問的舊頁(yè)子表匕累。

具體的可以參考官網(wǎng)的圖如下:

緩沖池列表.JPG

2 實(shí)現(xiàn)

MySQL改進(jìn)的LRU算法將那些被頻繁查詢的頁(yè)放在表頭部的新頁(yè)子表中,表尾的舊頁(yè)子表則放那些較少使用的頁(yè)默伍,這些頁(yè)也是淘汰的候選頁(yè)欢嘿。

默認(rèn)配置下,算法操作如下:

  • 3/8的列表劃分為尾部的舊頁(yè)子表也糊,存放那些可以淘汰的舊頁(yè)炼蹦。

  • 列表中點(diǎn)(midpoint,注意這里雖然說是中點(diǎn)狸剃,但是不一定是嚴(yán)格的中間位置掐隐,比如默認(rèn)配置下,該位置從表頭計(jì)算為列表5/8的位置)是新頁(yè)子表和舊頁(yè)子表的邊界钞馁。

  • 當(dāng) InnoDB從磁盤讀一頁(yè)數(shù)據(jù)并放入緩沖池中時(shí)虑省,它會(huì)將此頁(yè)插入到列表的中間位置(也就是舊頁(yè)子表的頭部)。發(fā)生讀頁(yè)一般是因?yàn)橛脩舨樵償?shù)據(jù)僧凰,或者InnoDB自動(dòng)觸發(fā)的read-ahead操作探颈。

  • 讀取舊頁(yè)子表中的數(shù)據(jù)會(huì)讓該頁(yè)變新(年輕,young)训措,并將其移動(dòng)到緩沖池的頭部(也就是新頁(yè)子表的頭部)伪节。如果是因?yàn)橛脩舨樵冏x造成該頁(yè)被讀取光羞,則該頁(yè)會(huì)立即被標(biāo)識(shí)為年輕,并直接插入到列表頭部怀大。如果該頁(yè)因?yàn)閞ead-ahead被讀取纱兑,則首次讀取該頁(yè)并放入緩沖池時(shí)不會(huì)將該頁(yè)放入新頁(yè)列表頭部,而是放入列表中點(diǎn)化借,需要再次讀取才能使該頁(yè)被標(biāo)識(shí)為年輕狀態(tài)潜慎。(該頁(yè)可能一直沒有被標(biāo)識(shí)為年輕狀態(tài)直到被淘汰)。

MySQL通過參數(shù)innodb_old_blocks_pct來控制舊頁(yè)子表占整個(gè)緩沖池列表的比例屏鳍,默認(rèn)為37勘纯,也就是上面說的3/8。

默認(rèn)的緩沖中的頁(yè)在第一次被讀取時(shí)(也就是命中緩存)會(huì)被移動(dòng)到新頁(yè)子表頭部钓瞭,意味著其會(huì)長(zhǎng)期待在緩沖池中不會(huì)被淘汰驳遵。這樣就會(huì)存在一個(gè)問題,一次表掃描(比如使用mysqldump或者沒有條件的select查詢)可能會(huì)將大量數(shù)據(jù)放入緩存中山涡,并淘汰相應(yīng)數(shù)量的舊數(shù)據(jù)堤结,但是可能這些數(shù)據(jù)只使用一次,后面不再使用鸭丛;同樣地竞穷,因?yàn)镸ySQL自動(dòng)觸發(fā)的read-ahead也會(huì)在下一次訪問該頁(yè)時(shí)被放入新頁(yè)子表頭部。這些情形會(huì)將本應(yīng)會(huì)被頻繁使用的頁(yè)移動(dòng)到舊頁(yè)子表中鳞溉。

所以MySQL采用如下方式避免上面的問題瘾带,新讀取的頁(yè)會(huì)放入緩沖池中點(diǎn),也即默認(rèn)情況下所有的新讀取的頁(yè)都會(huì)被插入到尾部開始的3/8位置處熟菲。在后面的第一次命中(被訪問時(shí))的頁(yè)會(huì)被移動(dòng)到列表的頭部看政。因此,那些讀入緩存但是后面從來不會(huì)被訪問的頁(yè)也從不會(huì)被放入列表的頭部抄罕,也就會(huì)在后面被從緩沖池淘汰允蚣。

read-ahead、或者表呆贿、索引掃描都會(huì)造成類似的緩沖池?cái)_動(dòng)嚷兔。在這些情景下,頁(yè)通常會(huì)被讀茸鋈搿(命中)若干次冒晰,然后從此不再訪問。為此MySQL提供了配置參數(shù)innodb_old_blocks_time用來指定該頁(yè)在放入緩沖池后第一次讀之后一定時(shí)間內(nèi)(時(shí)間窗口竟块,單位毫秒,milliseconds)讀取不會(huì)被標(biāo)識(shí)為年輕翩剪,也就是不會(huì)被移動(dòng)到列表頭部。參數(shù)innodb_old_blocks_time的默認(rèn)值是1000彩郊,增大這個(gè)參數(shù)將會(huì)造成更多的頁(yè)會(huì)更快的從緩沖池中被淘汰前弯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚪缀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恕出,更是在濱河造成了極大的恐慌询枚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浙巫,死亡現(xiàn)場(chǎng)離奇詭異金蜀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)的畴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門渊抄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丧裁,你說我怎么就攤上這事护桦。” “怎么了煎娇?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵二庵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我缓呛,道長(zhǎng)催享,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任哟绊,我火速辦了婚禮因妙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘票髓。我一直安慰自己攀涵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布炬称。 她就那樣靜靜地躺著,像睡著了一般涡拘。 火紅的嫁衣襯著肌膚如雪玲躯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天鳄乏,我揣著相機(jī)與錄音跷车,去河邊找鬼。 笑死橱野,一個(gè)胖子當(dāng)著我的面吹牛朽缴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播水援,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼密强,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼茅郎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起或渤,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤系冗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后薪鹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掌敬,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年池磁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奔害。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡地熄,死狀恐怖华临,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情离斩,我是刑警寧澤银舱,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站跛梗,受9級(jí)特大地震影響寻馏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜核偿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一诚欠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漾岳,春花似錦轰绵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捅儒,卻和暖如春液样,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巧还。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工鞭莽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麸祷。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓澎怒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阶牍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喷面,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355