mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool
緩存的重要性
我們只需要訪問一個頁的一條記錄,那也需要先把整個頁的數(shù)據(jù)加載到內(nèi)存中。將整個頁加載到內(nèi)存中后就可以進(jìn)行讀寫訪問了,在進(jìn)行完讀寫訪問之后并不著急把該頁對應(yīng)的內(nèi)存空間釋放掉,而是將其緩存起來,這樣將來有請求再次訪問該頁面時,就可以省去磁盤IO的開銷了。這樣能夠大大的增加效率。
InnoDB的Buffer Pool
Buffer Pool的概念
設(shè)計InnoDB的大叔為了緩存磁盤中的頁,在MySQL服務(wù)器啟動的時候就向操作系統(tǒng)申請了一片連續(xù)的內(nèi)存,他們給這片內(nèi)存起了個名,叫做Buffer Pool(中文名是緩沖池)。那它有多大呢?這個其實看我們機器的配置,如果你是土豪,你有512G內(nèi)存,你分配個幾百G作為Buffer Pool也可以啊,當(dāng)然你要是沒那么有錢,設(shè)置小點也行呀~ 默認(rèn)情況下Buffer Pool只有128M大小。當(dāng)然如果你嫌棄這個128M太大或者太小,可以在啟動服務(wù)器的時候配置innodb_buffer_pool_size參數(shù)的值,它表示Buffer Pool的大小,就像這樣: [server] innodb_buffer_pool_size = 268435456 其中,268435456的單位是字節(jié),也就是我指定Buffer Pool的大小為256M。需要注意的是,Buffer Pool也不能太小,最小值為5M(當(dāng)小于該值時會自動設(shè)置成5M)。
Buffer Pool內(nèi)部結(jié)構(gòu)
Buffer Pool中默認(rèn)的緩存頁大小和在磁盤上默認(rèn)的頁大小是一樣的,都是16KB。為了更好的管理這些在Buffer Pool中的緩存頁,設(shè)計InnoDB的大叔為每一個緩存頁都創(chuàng)建了一些所謂的控制信息,這些控制信息包括該頁所屬的表空間編號、頁號、緩存頁在Buffer Pool中的地址、鏈表節(jié)點信息、一些鎖信息以及LSN信息。 每個緩存頁對應(yīng)的控制信息占用的內(nèi)存大小是相同的,我們就把每個頁對應(yīng)的控制信息占用的一塊內(nèi)存稱為一個控制塊吧,控制塊和緩存頁是一一對應(yīng)的,它們都被存放到 Buffer Pool 中,其中控制塊被存放到 Buffer Pool 的前邊,緩存頁被存放到 Buffer Pool 后邊,所以整個Buffer Pool對應(yīng)的內(nèi)存空間看起來就是這樣的:
每一個控制塊都對應(yīng)一個緩存頁,那在分配足夠多的控制塊和緩存頁后,可能剩余的那點兒空間不夠一對控制塊和緩存頁的大小,自然就用不到嘍,這個用不到的那點兒內(nèi)存空間就被稱為碎片了。當(dāng)然,如果你把Buffer Pool的大小設(shè)置的剛剛好的話,也可能不會產(chǎn)生碎片~
free鏈表的管理
因為我們沒法得意buffer pool的那些內(nèi)存被使用了,也沒有辦法哪些是空閑的能夠被使用的,所以我們用控制塊來管理緩存頁,控制塊里有一個free鏈表來管理緩存頁的使用情況。
有了這個free鏈表之后事兒就好辦了,每當(dāng)需要從磁盤中加載一個頁到Buffer Pool中時,就從free鏈表中取一個空閑的緩存頁,并且把該緩存頁對應(yīng)的控制塊的信息填上(就是該頁所在的表空間、頁號之類的信息),然后把該緩存頁對應(yīng)的free鏈表節(jié)點從鏈表中移除,表示該緩存頁已經(jīng)被使用了~
緩存頁的哈希處理
我們?nèi)绾稳ピL問某個數(shù)據(jù)呢,如果數(shù)據(jù)加載到buffer pool中,我們怎么才能準(zhǔn)確的知道,這個內(nèi)容是不是已經(jīng)加載到了beffer pool中呢,是這樣的,我們其實是通過表空間號+頁號當(dāng)作key通過hash算法來定位,緩存頁就是一個value,通過hash表的方式,去尋址如果有的話就直接使用,如果沒有的話,我們就把數(shù)據(jù)從磁盤中加載進(jìn)來。
flush鏈表的管理
如果beffer pool其中某一頁的數(shù)據(jù)被修改,那么她就和磁盤中的數(shù)據(jù)不一致了,我們給這種數(shù)據(jù)一個狀態(tài),我們稱它是dirty,當(dāng)然最簡單的方法是一被修改我們立刻刷新到磁盤中保持高度的一致性,但是頻繁的刷盤會影響性能,所以一般情況下,我們都是到某一個時間點或者某一個條件然后去刷盤的。那么我們?nèi)绾尾拍芸焖俚亩ㄎ坏叫枰⒈P的數(shù)據(jù)呢,也就是我們所說的dirty page。其實緩存頁一被修改我們就把放到了一個專門放dirty page的鏈表中,我們稱它為flush鏈表,當(dāng)需要刷盤的時候一起進(jìn)行刷盤。
LRU鏈表的管理
其實beffer pool其實也不是無限大的,最后肯定會有滿的時候,那么我們應(yīng)該怎么去刪除數(shù)據(jù)讓新的數(shù)據(jù)加載進(jìn)來呢,答案肯定是最近使用頻率低肯定要首先淘汰,下面要說的肯定就是著名的lru淘汰算法,還有一定要注意的就是如果我們淘汰一個數(shù)據(jù)的時候一定要確定它是否是dirty page如果是的話那么就不能淘汰因為還沒有同步到磁盤,這樣的話就造成數(shù)據(jù)丟失。
總結(jié)
以上是生活随笔為你收集整理的mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定义mysql字段的编码模式_在 mys
- 下一篇: mysql跨服务器查询语句_MySQL