Mysql數(shù)據(jù)庫(kù)緩沖池詳解(Buffer pool)
Buffer pool的作用
InnoDB
存儲(chǔ)引擎是以頁(yè)為單位來(lái)管理存儲(chǔ)空間的,我們進(jìn)行的增刪改查操作其實(shí)本質(zhì)上都是在訪(fǎng)問(wèn)頁(yè)面(包括讀頁(yè)面、寫(xiě)頁(yè)面、創(chuàng)建新頁(yè)面等操作)。
而磁盤(pán) I/O 需要消耗的時(shí)間很多,而在內(nèi)存中進(jìn)行操作,效率則會(huì)高很多,為了能讓數(shù)據(jù)表或者索引中的數(shù)據(jù)隨時(shí)被我們所用,DBMS 會(huì)申請(qǐng)占用內(nèi)存來(lái)作為數(shù)據(jù)緩沖池 ,在真正訪(fǎng)問(wèn)頁(yè)面之前,需要把在磁盤(pán)上的頁(yè)緩存到內(nèi)存中的 Buffer Pool 之后才可以訪(fǎng)問(wèn)。
這樣做的好處是可以讓磁盤(pán)活動(dòng)最小化,從而 減少與磁盤(pán)直接進(jìn)行 I/O 的時(shí)間。
要知道,這種策略對(duì)提升 SQL 語(yǔ)句的查詢(xún)性能來(lái)說(shuō)至關(guān)重要。
如果索引的數(shù)據(jù)在緩沖池里,那么訪(fǎng)問(wèn)的成本就會(huì)降低很多。
即申請(qǐng)一塊內(nèi)存提前從磁盤(pán)中讀取數(shù)據(jù)到內(nèi)存,后續(xù)mysql訪(fǎng)問(wèn)數(shù)據(jù)都從Buffer pool 這個(gè)緩沖池里訪(fǎng)問(wèn),減少了磁盤(pán)IO的次數(shù),提高查詢(xún)效率。
緩沖池(Buffer Pool)
在 InnoDB 存儲(chǔ)引擎中有一部分?jǐn)?shù)據(jù)會(huì)放到內(nèi)存中,緩沖池則占了這部分內(nèi)存的大部分,它用來(lái)存儲(chǔ)各種數(shù)據(jù)的緩存,由下圖可以看到 InnoDB 緩沖池包括了數(shù)據(jù)頁(yè)、索引頁(yè)、插入緩沖、鎖信息、自適應(yīng) Hash 和數(shù)據(jù)字典信息等。
緩存原則
“位置 * 頻次”這個(gè)原則,可以幫我們對(duì) I/O 訪(fǎng)問(wèn)效率進(jìn)行優(yōu)化。
首先,位置決定效率,提供緩沖池就是為了在內(nèi)存中可以直接訪(fǎng)問(wèn)數(shù)據(jù)。
其次,頻次決定優(yōu)先級(jí)順序。因?yàn)榫彌_池的大小是有限的,比如磁盤(pán)有 200G,但是內(nèi)存只有 16G,緩沖池大小只有 1G,就無(wú)法將所有數(shù)據(jù)都加載到緩沖池里,這時(shí)就涉及到優(yōu)先級(jí)順序,會(huì)優(yōu)先對(duì)使用頻次高的熱數(shù)據(jù)進(jìn)行加載。
緩沖池的預(yù)讀特性
緩沖池的作用就是提升 I/O 效率,而我們進(jìn)行讀取數(shù)據(jù)的時(shí)候存在一個(gè)“局部性原理”,也就是說(shuō)我們使用了一些數(shù)據(jù),大概率還會(huì)使用它周?chē)囊恍?shù)據(jù),因此采用“預(yù)讀”的機(jī)制提前加載,可以減少未來(lái)可能的磁盤(pán) I/O 操作。
緩沖池如何讀取數(shù)據(jù)
緩沖池管理器會(huì)盡量將經(jīng)常使用的數(shù)據(jù)保存起來(lái),在數(shù)據(jù)庫(kù)進(jìn)行頁(yè)面讀操作的時(shí)候,首先會(huì)判斷該頁(yè)面 是否在緩沖池中,如果存在就直接讀取,如果不存在,就會(huì)通過(guò)內(nèi)存或磁盤(pán)將頁(yè)面存放到緩沖池中再進(jìn)行讀取。
緩存在數(shù)據(jù)庫(kù)中的結(jié)構(gòu)和作用如下圖所示:
mysql通過(guò)存儲(chǔ)引擎讀取到緩沖池,再?gòu)木彌_池讀取數(shù)據(jù),緩沖池就是媒介。
如果我們執(zhí)行 SQL 語(yǔ)句的時(shí)候更新了緩存池中的數(shù)據(jù),那么這些數(shù)據(jù)會(huì)馬上同步到磁盤(pán)上嗎?
實(shí)際上,當(dāng)我們對(duì)數(shù)據(jù)庫(kù)中的記錄進(jìn)行修改的時(shí)候,首先會(huì)修改緩沖池中頁(yè)里面的記錄信息,然后數(shù)據(jù)庫(kù)會(huì)以一定的頻率刷新到磁盤(pán)中。注意并不是每次發(fā)生更新操作,都會(huì)立即進(jìn)行磁盤(pán)回寫(xiě)。
緩沖池會(huì)采用一種叫做checkpoint
的機(jī)制 將數(shù)據(jù)回寫(xiě)到磁盤(pán)上,這樣做的好處就是提升了數(shù)據(jù)庫(kù)的整體性能。
比如,當(dāng)緩沖池不夠用時(shí),需要釋放掉一些不常用的頁(yè),此時(shí)就可以強(qiáng)行采用checkpoint的方式,將不常用的臟頁(yè)回寫(xiě)到磁盤(pán)上,然后再?gòu)木彺娉刂袑⑦@些頁(yè)釋放掉。
這里的臟頁(yè) (dirty page) 指的是緩沖池中被修改過(guò)的頁(yè),與磁盤(pán)上的數(shù)據(jù)頁(yè)不一致。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL綠色版設(shè)置編碼以及1067錯(cuò)誤詳解
這篇文章主要介紹了MySQL綠色版設(shè)置編碼,以及1067錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2017-05-05mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn)
這篇文章主要介紹了mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10mysql中l(wèi)ike % %模糊查詢(xún)的實(shí)現(xiàn)
這篇文章主要介紹了mysql中l(wèi)ike % %模糊查詢(xún)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Mysql實(shí)現(xiàn)增量恢復(fù)的方法詳解
本文給大家分享的是如何實(shí)現(xiàn)mysql增量恢復(fù)的場(chǎng)景以及具體實(shí)現(xiàn)方法,有需要的小伙伴可以參考下2018-07-07JDBC-idea導(dǎo)入mysql連接java的jar包(mac)的方法
這篇文章主要介紹了JDBC-idea導(dǎo)入mysql連接java的jar包(mac)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09MySQL5.7不停業(yè)務(wù)將傳統(tǒng)復(fù)制變更為GTID復(fù)制的實(shí)例
下面小編就為大家?guī)?lái)一篇MySQL5.7不停業(yè)務(wù)將傳統(tǒng)復(fù)制變更為GTID復(fù)制的實(shí)例。小編覺(jué)的挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03