一、前言
MySQL啟動(dòng)后,BufferPool就會(huì)被初始化,在你沒(méi)有執(zhí)行任何查詢操作之前,BufferPool中的緩存頁(yè)都是一塊塊空的內(nèi)存,未被使用過(guò)也沒(méi)有任何數(shù)據(jù)保存在里面。
而且你也知道了通過(guò)緩沖頁(yè)的描述信息可以直接且唯一的找到它所指向的緩存頁(yè)。
那你有沒(méi)有想過(guò),我們從磁盤(pán)里面讀取出來(lái)的 數(shù)據(jù)頁(yè) 應(yīng)該放到那個(gè)緩沖頁(yè)中去呢?
這個(gè)問(wèn)題就引出了Free List。
二、Free List
其實(shí)Free List是Buffer Pool中基于緩存頁(yè)描述信息 組織起來(lái)的雙向鏈表。換言之,F(xiàn)ree List中的每一個(gè)結(jié)點(diǎn)都是緩存頁(yè)對(duì)應(yīng)的描述信息。并且通過(guò)描述信息可以找到指定的緩存頁(yè)(緩存頁(yè))

InnoDB設(shè)計(jì)Free List的初衷就是為了解決上面說(shuō)的問(wèn)題。
如果這個(gè)緩存頁(yè)中沒(méi)有存儲(chǔ)任何數(shù)據(jù),那么它對(duì)應(yīng)的描述信息就會(huì)被維護(hù)進(jìn)Free List中。這時(shí)當(dāng)你想把從磁盤(pán)中讀取出一個(gè)數(shù)據(jù)頁(yè)放入緩存頁(yè)中的話,就得先從Free List中找一個(gè)節(jié)點(diǎn)(Free List中的所有節(jié)點(diǎn)都會(huì)指向一個(gè)從未被使用過(guò)的緩存頁(yè)),那接著就可以把你讀取出來(lái)的這個(gè)數(shù)據(jù)頁(yè)放入到該節(jié)點(diǎn)指向的緩存頁(yè)中。
相應(yīng)的:當(dāng)數(shù)據(jù)頁(yè)中被放入數(shù)據(jù)之后。它對(duì)應(yīng)的描述信息塊會(huì)被從Free List中移出。
三、如何判斷數(shù)據(jù)頁(yè)有沒(méi)有在緩存中?
你會(huì)不會(huì)納悶MySQL怎么知道剛讀取出來(lái)的這個(gè)數(shù)據(jù)頁(yè)有沒(méi)有在緩存頁(yè)中呢?
這個(gè)功能的實(shí)現(xiàn)依托于另一個(gè)數(shù)據(jù)結(jié)構(gòu):hash table
key = 表空間號(hào)+數(shù)據(jù)頁(yè)號(hào)
value = 緩存頁(yè)地址
如果存在于hash table中,那就說(shuō)明該數(shù)據(jù)頁(yè)已經(jīng)存在于Buffer Pool中了,優(yōu)先使用Buffer Pool中的緩存頁(yè)。相信你肯定能想到為啥優(yōu)先使用Buffer Pool中的緩存頁(yè)吧!首先免去了磁盤(pán)的隨機(jī)IO,其次緩存頁(yè)中的數(shù)據(jù)可能是已經(jīng)被修改了的臟數(shù)據(jù)。
以上就是詳解 MySQL的FreeList機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于MySQL FreeList機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- windows下MySQL5.6版本安裝及配置過(guò)程附有截圖和詳細(xì)說(shuō)明
- Mysql字符串截取函數(shù)SUBSTRING的用法說(shuō)明
- MySQL創(chuàng)建用戶與授權(quán)方法
- mysql 添加索引 mysql 如何創(chuàng)建索引
- 超詳細(xì)mysql left join,right join,inner join用法分析
- mySQL中replace的用法
- Mysql查看版本號(hào)的幾種方式
- Mysql命令行導(dǎo)入sql數(shù)據(jù)
- Mysql的Root密碼忘記,查看或修改的解決方法(圖文介紹)
- MySQL數(shù)據(jù)庫(kù)遠(yuǎn)程連接開(kāi)啟方法