當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]Mysql 中數(shù)據(jù)是要落盤的,這點大家都知道。讀寫磁盤速度是很慢的,尤其和內(nèi)存比起來更是沒的說。但是,我們平時在執(zhí)行 SQL 時,無論寫操作還是讀操作都能很快得到結(jié)果,并沒有預(yù)想中的那么慢。 可能你會說我有索引啊,有索引當(dāng)然快了。但是鐵子,索引文件也是

Mysql 中數(shù)據(jù)是要落盤的,這點大家都知道。讀寫磁盤速度是很慢的,尤其和內(nèi)存比起來更是沒的說。但是,我們平時在執(zhí)行 SQL 時,無論寫操作還是讀操作都能很快得到結(jié)果,并沒有預(yù)想中的那么慢。

可能你會說我有索引啊,有索引當(dāng)然快了。但是鐵子,索引文件也是存儲在磁盤上的,查找過程會產(chǎn)生磁盤 I/O。如果同時對某行數(shù)據(jù)進行多次操作,那豈不是要重復(fù)產(chǎn)生很多次磁盤 IO 嗎?

可能你想到了,那我把數(shù)據(jù)存在內(nèi)存里不就可以了嗎?內(nèi)存速度比磁盤快,這準沒毛病。沒錯,那該怎么存呢? 這就是我們今天所要講的主題——緩沖池(buffer pool)

各位看官,請跟我來~

你不好奇緩沖池里的秘密嗎?

- 思維導(dǎo)圖 -



初識緩沖池

上邊我們提到過了,執(zhí)行 SQL 對某一行進行操作時,總不能每次都直接進行磁盤操作吧。好歹有個緩沖地帶,不然每次都深入老巢這誰受得了。

這不緩沖池就應(yīng)運而生了,簡單來說就是一塊內(nèi)存區(qū)域。它存在的原因之一是為了避免每次都去訪問磁盤,把最常訪問的數(shù)據(jù)放在緩存里,提高數(shù)據(jù)的訪問速度。

了解了它的作用,接下來讓我們先來看下緩沖池在整個 Mysql 架構(gòu)里處于什么樣的地方,有一個宏觀的認識。


你不好奇緩沖池里的秘密嗎?

我們再來看看它的內(nèi)部組成部分。在緩沖池中,除數(shù)據(jù)頁和索引頁外還有多種類型:


你不好奇緩沖池里的秘密嗎?

 緩沖池的應(yīng)用

緩沖池你也了解了,可能此時你最關(guān)注的是它在 SQL 執(zhí)行時起了一個什么樣的作用。上篇文章中我們簡單的提到過一條 SQL 語句的執(zhí)行過程,但并未涉及到緩沖池相關(guān)的問題。這期我們?nèi)允且砸粭l SQL 來作為切入點。

當(dāng)一條 SQL 執(zhí)行的時候,如果是讀操作,要查找的數(shù)據(jù)所在的數(shù)據(jù)頁在內(nèi)存中時,則將結(jié)果返回。否則會把對應(yīng)的數(shù)據(jù)頁加載到內(nèi)存中,然后再返回結(jié)果。

同樣對于寫操作來說。如果要修改的行所在的數(shù)據(jù)頁在內(nèi)存中,則修改后返回對應(yīng)的結(jié)果(當(dāng)然還有后續(xù)操作)。如果不在的話,則會從磁盤里將該行所對應(yīng)的數(shù)據(jù)頁讀到內(nèi)存中再進行修改。

好了,現(xiàn)在讓我們回到開始時候的問題。為什么操作磁盤慢,但是 SQL 執(zhí)行卻不慢呢。到這里相信你也差不多知道了吧。

緩沖池的存在,很大程度減少了磁盤 I/O 帶來的開銷。要操作的數(shù)據(jù)行所在的數(shù)據(jù)頁如果存在于緩存中的話,就不需要從磁盤中進行讀取。這樣在執(zhí)行后就可以很快拿到結(jié)果。

 緩沖池的預(yù)讀機制

我們可以看出來,只要不存在或減少磁盤 I/O,執(zhí)行速度自然就會變快。那么對于加載數(shù)據(jù)頁這種無法避免的磁盤 I/O 來說是否有更好的方式呢?既然避免不了,那減少磁盤 I/O 的次數(shù)總可以吧?

這就是我們要講的 Mysql 中「預(yù)讀」的新特性,它是 Innodb 通過在緩沖池中提前讀取多個數(shù)據(jù)頁來優(yōu)化 I/O 的一種方式。因為磁盤讀寫的時候,是按照頁的方式來讀取的(你可以理解為固定大小的數(shù)據(jù),例如一頁數(shù)據(jù)為 16K),每次至少讀入一頁的數(shù)據(jù),如果下次讀取的數(shù)據(jù)就在頁中,就不用再去磁盤上讀取了,從而減少了磁盤 I/O。

可以在命令行通過如下命令查看對應(yīng)的頁大?。?/span>

你不好奇緩沖池里的秘密嗎?


 緩沖池的空間管理

你可能會有疑問,緩沖池這么洋氣的東西,為什么不把所有的數(shù)據(jù)都放到緩沖池里呢?這樣速度豈不是美滋滋,放到磁盤里慢的跟老牛拉車一樣。

哎,哥,醒醒,拋開內(nèi)存的易失性不談,緩沖池也是有大小限制的。那你可能又有疑惑了,既然緩沖池有大小限制,那我每次都讀入的數(shù)據(jù)頁怎么來管理呢。別的數(shù)據(jù)頁都占了地兒了,哪有我的位置?

這里我們來聊聊緩沖池的空間管理,其實對緩沖池進行管理的關(guān)鍵部分是如何安排進池的數(shù)據(jù)并且按照一定的策略淘汰池中的數(shù)據(jù),保證池中的數(shù)據(jù)不“溢出”,同時還能保證常用數(shù)據(jù)留在池子中。


你不好奇緩沖池里的秘密嗎?

傳統(tǒng) LRU 淘汰法

緩沖池是基于傳統(tǒng)的 LRU 方法來進行緩存頁管理的,我們先來看下如果使用 LRU 是如何管理的。

LRU,全稱是 Least Recently Used,中文名字叫作「最近最少使用」。從名字上就很容易理解了。

這里分兩種情況:

(1)緩存頁已在緩沖池中

這種情況下會將對應(yīng)的緩存頁放到 LRU 鏈表的頭部,無需從磁盤再進行讀取,也無需淘汰其它緩存頁。

如下圖所示,如果要訪問的數(shù)據(jù)在 6 號頁中,則將 6 號頁放到鏈表頭部即可,這種情況下沒有緩存頁被淘汰。


你不好奇緩沖池里的秘密嗎?

(2)緩存頁不在緩沖池中

緩存頁不在緩沖中,這時候就需要從磁盤中讀入對應(yīng)的數(shù)據(jù)頁,將其放置在鏈表頭部,同時淘汰掉末尾的緩存頁

如下圖所示,如果要訪問的數(shù)據(jù)在 60 號頁中,60 號頁不在緩沖池中,此時加載進來放到鏈表的頭部,同時淘汰掉末尾的 17 號緩存頁。


你不好奇緩沖池里的秘密嗎?

是不是看上去很簡單,同時也能滿足緩沖池淘汰緩存頁的方法?但是我們來思考幾個問題:

  • 預(yù)讀失效

上面我們提到了緩沖池的預(yù)讀機制可能會預(yù)先加載相鄰的數(shù)據(jù)頁。假如加載了 20、21 相鄰的兩個數(shù)據(jù)頁,如果只有頁號為 20 的緩存頁被訪問了,而另一個緩存頁卻沒有被訪問。此時兩個緩存頁都在鏈表的頭部,但是為了加載這兩個緩存頁卻淘汰了末尾的緩存頁,而被淘汰的緩存頁卻是經(jīng)常被訪問的。這種情況就是預(yù)讀失效,被預(yù)先加載進緩沖池的頁,并沒有被訪問到,這種情況是不是很不合理。

  • 緩沖池污染

還有一種情況是當(dāng)執(zhí)行一條 SQL 語句時,如果掃描了大量數(shù)據(jù)或是進行了全表掃描,此時緩沖池中就會加載大量的數(shù)據(jù)頁,從而將緩沖池中已存在的所有頁替換出去,這種情況同樣是不合理的。這就是緩沖池污染,并且還會導(dǎo)致 MySQL 性能急劇下降。

冷熱數(shù)據(jù)分離

這樣看來,傳統(tǒng)的 LRU 方法并不能滿足緩沖池的空間管理。因此,Msyql 基于 LRU 設(shè)計了冷熱數(shù)據(jù)分離的處理方案。

也就是將 LRU 鏈表分為兩部分,一部分為熱數(shù)據(jù)區(qū)域,一部分為冷數(shù)據(jù)區(qū)域。


你不好奇緩沖池里的秘密嗎?


當(dāng)數(shù)據(jù)頁第一次被加載到緩沖池中的時候,先將其放到冷數(shù)據(jù)區(qū)域的鏈表頭部,1s(由 innodb_old_blocks_time 參數(shù)控制) 后該緩存頁被訪問了再將其移至熱數(shù)據(jù)區(qū)域的鏈表頭部。


你不好奇緩沖池里的秘密嗎?


可能你會有疑惑了,為什么要等 1s 后才將其移至熱數(shù)據(jù)區(qū)域呢?你想想,如果數(shù)據(jù)頁剛被加載到冷數(shù)據(jù)區(qū)就被訪問了,之后再也不訪問它了呢?這不就造成熱數(shù)據(jù)區(qū)的浪費了嗎?要是 1s 后不訪問了,說明之后可能也不會去頻繁訪問它,也就沒有移至熱緩沖區(qū)的必要了。當(dāng)緩存頁不夠的時候,從冷數(shù)據(jù)區(qū)淘汰它們就行了。

另一種情況,當(dāng)我的數(shù)據(jù)頁已經(jīng)在熱緩沖區(qū)了,是不是緩存頁只要被訪問了就將其插到鏈表頭部呢?不用我說你肯定也覺得不合理。熱數(shù)據(jù)區(qū)域里的緩存頁是會被經(jīng)常訪問的,如果每訪問一個緩存頁就插入一次鏈表頭,那整個熱緩沖區(qū)里就異常騷動了,你想想那個畫面。

那咋整呢?Mysql 中優(yōu)化為熱數(shù)據(jù)區(qū)的后 3/4 部分被訪問后才將其移動到鏈表頭部去,對于前 1/4 部分的緩存頁被訪問了不會進行移動。

好了,到這里關(guān)于 buffer pool  的知識就講完了。這期里我們講了 buffer pool 能使 SQL 執(zhí)行變快的原因,同時還講了有關(guān) buffer pool 空間的管理方式。歡迎在留言區(qū)里進行討論。
 總結(jié)

緩沖池的應(yīng)用

  • 緩沖池很大程度減少了磁盤 I/O 帶來的開銷,通過將操作的數(shù)據(jù)行所在的數(shù)據(jù)頁加載到緩沖池可以提高 SQL 的執(zhí)行速度。

緩沖池的預(yù)讀機制

  • 為了減少磁盤 I/O,Innodb 通過在緩沖池中提前讀取多個數(shù)據(jù)頁來進行優(yōu)化,這種方式叫作預(yù)讀。

緩沖池的空間管理

  • 傳統(tǒng)的LRU方法對于緩沖池來說,會導(dǎo)致預(yù)讀失效和緩沖池污染兩種情況,因此這種傳統(tǒng)的方式并不適用緩沖池的空間管理。

  • 基于對 LRU 方法的優(yōu)化,Msyql 設(shè)計了冷熱數(shù)據(jù)分離的處理方案,將LRU鏈表分為熱數(shù)據(jù)區(qū)和冷數(shù)據(jù)區(qū)兩部分,這樣就可以解決預(yù)讀失效和緩沖池污染的情況。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉