Hi,大家好!我是白日夢!
今天我要跟你分享的MySQL話題是:“了解InnoDB的FreeList嗎?談談看!”
本文是MySQL專題的第 7 篇,共110篇。
一、回顧
前面幾篇文章白日夢和你分享了,我們從磁盤中讀取出來的數據頁以緩存頁和描述信息的方式組織在Buffer Pool中。
MySQL啟動后,BufferPool就會被初始化,在你沒有執行任何查詢操作之前,BufferPool中的緩存頁都是一塊塊空的內存,未被使用過也沒有任何數據保存在里面。
而且你也知道了通過緩沖頁的描述信息可以直接且唯一的找到它所指向的緩存頁。
那你有沒有想過,我們從磁盤里面讀取出來的 數據頁 應該放到那個緩沖頁中去呢?
這個問題就引出了Free List。
二、Free List
其實Free List是Buffer Pool中基於緩存頁描述信息 組織起來的雙向鏈表。換言之,Free List中的每一個結點都是緩存頁對應的描述信息。並且通過描述信息可以找到指定的緩存頁(緩存頁)

InnoDB設計Free List的初衷就是為了解決上面說的問題。
如果這個緩存頁中沒有存儲任何數據,那么它對應的描述信息就會被維護進Free List中。這時當你想把從磁盤中讀取出一個數據頁放入緩存頁中的話,就得先從Free List中找一個節點(Free List中的所有節點都會指向一個從未被使用過的緩存頁),那接着就可以把你讀取出來的這個數據頁放入到該節點指向的緩存頁中。
相應的:當數據頁中被放入數據之后。它對應的描述信息塊會被從Free List中移出。
三、如何判斷數據頁有沒有在緩存中?
你會不會納悶MySQL怎么知道剛讀取出來的這個數據頁有沒有在緩存頁中呢?
這個功能的實現依托於另一個數據結構:hash table
key = 表空間號+數據頁號
value = 緩存頁地址
如果存在於hash table中,那就說明該數據頁已經存在於Buffer Pool中了,優先使用Buffer Pool中的緩存頁。相信你肯定能想到為啥優先使用Buffer Pool中的緩存頁吧!首先免去了磁盤的隨機IO,其次緩存頁中的數據可能是已經被修改了的臟數據。
四、推薦閱讀
4、能談談year、date、datetime、time、timestamp的區別嗎?
關注送書!《Netty實戰》
文章公號號首發!連載中!關注微信公號回復:“抽獎” 可參加抽📖活動


