這篇文章主要介紹“MySQL中的數(shù)據(jù)庫(kù)緩沖池怎么管理”,在日常操作中,相信很多人在MySQL中的數(shù)據(jù)庫(kù)緩沖池怎么管理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL中的數(shù)據(jù)庫(kù)緩沖池怎么管理”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司主打移動(dòng)網(wǎng)站、成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、域名與空間、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻?hù)承諾穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
對(duì)于使用InnoDB存儲(chǔ)引擎的表來(lái)說(shuō),是以頁(yè)為單位來(lái)管理存儲(chǔ)空間的,作為內(nèi)存和磁盤(pán)之間換入換出的基本粒度。當(dāng)我們將某頁(yè)從磁盤(pán)中加載到內(nèi)存中,會(huì)進(jìn)行磁盤(pán)I/O。而磁盤(pán)I/O的開(kāi)銷(xiāo)非常影響整體性能,如果我們直接從內(nèi)存中讀取相應(yīng)的頁(yè),那豈不是減少了磁盤(pán)I/O帶來(lái)的性能損耗,效率則會(huì)提升很多?;诖?,緩沖池(
Buffer Pool
)出現(xiàn)了,那么接下來(lái),我們就來(lái)談?wù)処nnoDB中的Buffer Pool。
有人會(huì)想,既然緩沖池這么好,那我們將所有數(shù)據(jù)都存儲(chǔ)到緩沖池中不就好了,不不不,緩沖池是操作系統(tǒng)分配的一片連續(xù)的內(nèi)存。而內(nèi)存相比于磁盤(pán)的容量小得多,并且價(jià)格昂貴。那么操作系統(tǒng)會(huì)給緩沖池分配多少內(nèi)存呢?
默認(rèn)情況下,緩沖池的大小為128MB;
當(dāng)然,如果你的機(jī)器的內(nèi)存容量非常大,可以在配置文件中配置啟動(dòng)選項(xiàng)參數(shù)innodb_buffer_pool_size
單位是字節(jié),最小不能小于5MB。
緩沖池將操作系統(tǒng)分配的這一片連續(xù)的內(nèi)存,劃分成若干個(gè)大小默認(rèn)為16KB的頁(yè)(緩沖頁(yè))【此時(shí)還沒(méi)有真正的磁盤(pán)頁(yè)被緩存到Buffer Pool中】,當(dāng)我們從磁盤(pán)中換入一個(gè)頁(yè)到緩沖池中,如何分配位置呢?因此就需要一些控制信息來(lái)標(biāo)識(shí)這些緩沖池中的緩沖頁(yè),這些控制信息都存放在一個(gè)叫控制塊的內(nèi)存區(qū)域中,與緩沖頁(yè)一一對(duì)應(yīng)。控制塊的大小也是固定的。因此在這片連續(xù)的內(nèi)存空間中,難免會(huì)產(chǎn)生內(nèi)存碎片。綜上,緩沖池的內(nèi)部結(jié)構(gòu)如下:
緩沖頁(yè)
控制塊:頁(yè)號(hào)、緩沖頁(yè)在緩沖池中的地址、鏈表節(jié)點(diǎn)信息等。
內(nèi)存碎片【若內(nèi)存分配得當(dāng),內(nèi)存碎片可有可無(wú)】
上面在控制塊中提到了鏈表節(jié)點(diǎn)信息,那么鏈表節(jié)點(diǎn)是用來(lái)做什么的呢?是為了更好的管理緩沖池中的頁(yè)。而鏈表就是用來(lái)鏈接控制塊的,因?yàn)榭刂茐K與緩沖頁(yè)是一一對(duì)應(yīng)的。
將所有空閑的緩沖頁(yè)對(duì)應(yīng)的控制塊鏈接起來(lái),形成的鏈表。
解決的問(wèn)題:從磁盤(pán)中換入一個(gè)頁(yè)到緩沖池中,如何區(qū)分緩沖池中的哪個(gè)頁(yè)是空閑的呢?而有了空閑鏈表之后,換入一個(gè)磁盤(pán)頁(yè)到緩沖池中時(shí),就直接從空閑鏈表中獲取一個(gè)空閑的緩沖頁(yè),并將磁盤(pán)頁(yè)中對(duì)應(yīng)的信息填到緩沖頁(yè)對(duì)應(yīng)的控制塊中,然后將該控制塊從空閑鏈表中刪除即可。
若修改了緩沖池中的緩沖頁(yè)的數(shù)據(jù),導(dǎo)致其與磁盤(pán)中數(shù)據(jù)不一致,該頁(yè)稱(chēng)為臟頁(yè)。將所有臟頁(yè)對(duì)應(yīng)的控制塊鏈接起來(lái)形成更新鏈表,在將來(lái)的某個(gè)時(shí)間根據(jù)該鏈表將對(duì)應(yīng)緩存頁(yè)的數(shù)據(jù)刷新到磁盤(pán)中。
緩沖池的大小是有限的,如果緩存的頁(yè)超出了緩沖池的大小,即沒(méi)有空閑的緩沖頁(yè)了,當(dāng)有新的頁(yè)要添加到緩沖池中時(shí),采取LRU的策略將舊的緩沖頁(yè)從緩沖池中移除,然后將新的頁(yè)添加進(jìn)來(lái)。由于LRU鏈表涉及的內(nèi)容較多,我們接下來(lái)單獨(dú)介紹。
在I/O上的優(yōu)化機(jī)制,預(yù)讀顧名思義,會(huì)異步地把某些頁(yè)面加載到緩沖池中,預(yù)計(jì)很快就會(huì)需要這些頁(yè)面,這些請(qǐng)求在一個(gè)范圍內(nèi)引入所有頁(yè)面,就是所謂的 局部性原理
,目的是減少磁盤(pán)I/O。
了解預(yù)讀機(jī)制之前,先回顧一下InnoDB邏輯存儲(chǔ)單元:表空間(tablespace)→段(segment )→區(qū)(extent)→頁(yè)(page)。其中特意提一下區(qū),后面會(huì)用到:一個(gè)區(qū)就是物理位置上連續(xù)的64個(gè)頁(yè)
,即一個(gè)區(qū)的大小是1MB.
預(yù)讀機(jī)制可以細(xì)分為以下兩種:
Linear read-ahead(線性預(yù)讀):一種基于按順序訪問(wèn)的緩沖池中的頁(yè)面來(lái)預(yù)測(cè)可能很快需要哪些頁(yè)面的技術(shù)。通過(guò)配置參數(shù)innodb_read_ahead_threshold,若順序訪問(wèn)的某個(gè)區(qū)的頁(yè)面超過(guò)這個(gè)參數(shù)的值,會(huì)觸發(fā)異步讀請(qǐng)求來(lái)讀取下一個(gè)區(qū)中全部的頁(yè)面到緩沖池中。
Random read-ahead(隨機(jī)預(yù)讀):可以根據(jù)緩沖池中已經(jīng)存在的頁(yè)面預(yù)測(cè)何時(shí)可能需要頁(yè)面,而不管這些頁(yè)面的讀取順序如何。如果在緩沖池中發(fā)現(xiàn)同一個(gè)區(qū)段的13個(gè)連續(xù)頁(yè)面,InnoDB會(huì)異步發(fā)出一個(gè)請(qǐng)求來(lái)預(yù)取該區(qū)段的剩余頁(yè)面。通過(guò)配置變量innodb_random_read_ahead來(lái)控制隨機(jī)讀的。
利用LRU算法對(duì)最近最少使用的緩沖頁(yè)進(jìn)行管理,形成對(duì)應(yīng)的鏈表,方便用于淘汰。
當(dāng)訪問(wèn)一個(gè)頁(yè)【即最近訪問(wèn)】
該頁(yè)在緩沖池中,將對(duì)應(yīng)控制塊移至LRU鏈表頭部
該頁(yè)不在緩沖池中,淘汰尾部最近最少使用的頁(yè),從磁盤(pán)中加載進(jìn)來(lái)該頁(yè)并放在LRU鏈表頭部
那么為什么InnoDB不使用這么直觀的LRU算法呢?原因如下:
預(yù)讀失效
預(yù)讀到緩沖池中的頁(yè)都會(huì)放到LRU鏈表的頭部,但其中很多頁(yè)可能并不會(huì)被讀取。
緩沖池污染
很多使用頻率較低的頁(yè)加載到緩沖池中,會(huì)把使用頻率較高的頁(yè)從緩沖池中淘汰掉。比如全表掃描
基于上述缺點(diǎn),優(yōu)化后的具體方法將傳統(tǒng)LRU鏈表劃分為兩部分:熱數(shù)據(jù)區(qū)域【年輕區(qū)】&冷數(shù)據(jù)區(qū)域【老年區(qū)】
熱數(shù)據(jù)區(qū)域【年輕區(qū)】:使用頻率高的緩沖頁(yè)
冷數(shù)據(jù)區(qū)域【老年區(qū)】:使用頻率低的區(qū)域
結(jié)構(gòu)簡(jiǎn)圖如下所示:
如圖所示,熱數(shù)據(jù)區(qū)域與冷數(shù)據(jù)區(qū)域分別占用不同比例,那么我們可以通過(guò)innodb_old_blocks_pct
啟動(dòng)選項(xiàng)來(lái)控制冷數(shù)據(jù)區(qū)域所占比例。
改進(jìn)后的LRU如何更好的解決預(yù)讀失效問(wèn)題呢?
某個(gè)頁(yè)在初次加載到緩沖池中時(shí),先淘汰掉冷數(shù)據(jù)區(qū)域尾部的控制塊(即其對(duì)應(yīng)的頁(yè)淘汰掉),然后新頁(yè)對(duì)應(yīng)的控制塊會(huì)先放到冷數(shù)據(jù)區(qū)域的頭部。
若后續(xù)該頁(yè)不被進(jìn)行訪問(wèn)就會(huì)慢慢從冷數(shù)據(jù)區(qū)域中被淘汰掉,總體不會(huì)影響熱數(shù)據(jù)區(qū)域訪問(wèn)頻繁的緩沖頁(yè)。
改進(jìn)后的LRU如何更好的解決緩沖池污染問(wèn)題呢?
先說(shuō)結(jié)論,并沒(méi)有很好的優(yōu)化這個(gè)問(wèn)題,原因如下【以全表掃描為例】:
某個(gè)初次訪問(wèn)的頁(yè)同樣會(huì)放到冷數(shù)據(jù)區(qū)域的頭部,但后續(xù)訪問(wèn)又會(huì)將其放到熱數(shù)據(jù)區(qū)域的頭部,這樣同樣會(huì)把訪問(wèn)頻率較高的頁(yè)給擠掉。
那么到底該如何解決緩沖池污染問(wèn)題呢?
緩沖池引入了冷數(shù)據(jù)區(qū)域時(shí)間窗口機(jī)制,即只有后續(xù)訪問(wèn)該頁(yè)與第一訪問(wèn)該頁(yè)的時(shí)間間隔大于規(guī)定的窗口值,就會(huì)將該頁(yè)從冷數(shù)據(jù)區(qū)域移到熱數(shù)據(jù)區(qū)域的頭部。小于規(guī)定的窗口值,就不會(huì)進(jìn)行移動(dòng)操作。
同樣,窗口值可通過(guò)innodb_old_blocks_time
參數(shù)【單位ms】來(lái)設(shè)置,默認(rèn)1000ms,而1s會(huì)篩選掉大部分像全表掃描這樣的操作。比如在一次全表掃描過(guò)程中,多次訪問(wèn)一個(gè)頁(yè)面的時(shí)間間隔不會(huì)超過(guò)1s。
緩沖池和查詢(xún)緩存是一個(gè)東西嗎?→不是
緩沖池會(huì)盡量將經(jīng)常使用的數(shù)據(jù)保存起來(lái),在MySQL進(jìn)行頁(yè)面讀操作的時(shí)候,首先會(huì)判斷該頁(yè)面是否在緩沖池中,如果存在就直接讀取,如果不存在,就會(huì)通過(guò)內(nèi)存或磁盤(pán)將頁(yè)面存放到緩沖池中再進(jìn)行讀取。
查詢(xún)緩存是提前把查詢(xún)結(jié)果緩存起來(lái),這樣下次不需要執(zhí)行就可以直接拿到結(jié)果。需要說(shuō)明的是,在MySQL中的查詢(xún)緩存,不是緩存查詢(xún)計(jì)劃,而是查詢(xún)對(duì)應(yīng)的結(jié)果。命中條件苛刻,而且只要數(shù)據(jù)表發(fā)生變化,查詢(xún)緩存就會(huì)失效,因此命中率低。
到此,關(guān)于“MySQL中的數(shù)據(jù)庫(kù)緩沖池怎么管理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
網(wǎng)頁(yè)標(biāo)題:MySQL中的數(shù)據(jù)庫(kù)緩沖池怎么管理
網(wǎng)頁(yè)路徑:http://www.rwnh.cn/article2/jisjoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站營(yíng)銷(xiāo)、建站公司、網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)