日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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

各位看官,請(qǐng)跟我來(lái)~

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

- 思維導(dǎo)圖 -



初識(shí)緩沖池

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

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

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


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

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


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

 緩沖池的應(yīng)用

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

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

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

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

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

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

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

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

可以在命令行通過(guò)如下命令查看對(duì)應(yīng)的頁(yè)大小:

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


 緩沖池的空間管理

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

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

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


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

傳統(tǒng) LRU 淘汰法

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

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

這里分兩種情況:

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

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

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


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

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

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

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


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

是不是看上去很簡(jiǎn)單,同時(shí)也能滿足緩沖池淘汰緩存頁(yè)的方法?但是我們來(lái)思考幾個(gè)問題:

  • 預(yù)讀失效

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

  • 緩沖池污染

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

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

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

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


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


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


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


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

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

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

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

緩沖池的應(yīng)用

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

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

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

緩沖池的空間管理

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

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


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

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉