一看就懂的MySQL的FreeList機制

2021-10-11 23:31:52 字數 1388 閱讀 7470

今天我要跟你分享的mysql話題是:「了解innodb的freelist嗎?談談看!」

前面幾篇文章白日夢和你分享了,我們從磁碟中讀取出來的資料頁以快取頁和描述資訊的方式組織在buffer pool中。

mysql啟動後,bufferpool就會被初始化,在你沒有執行任何查詢操作之前,bufferpool中的快取頁都是一塊塊空的記憶體,未被使用過也沒有任何資料儲存在裡面。

而且你也知道了通過緩衝頁的描述資訊可以直接且唯一的找到它所指向的快取頁。

那你有沒有想過,我們從磁碟裡面讀取出來的 資料頁 應該放到那個緩衝頁中去呢?

這個問題就引出了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,其次快取頁中的資料可能是已經被修改了的髒資料。

1、談談mysql中基數是什麼?

2、聊聊什麼是慢查?如何監控?如何排查?

3、對not null欄位插入null值有啥現象?

4、能談談year、date、datetime、time、timestamp的區別嗎?

5、你有沒有搞混查詢快取和buffer pool?談談看!

6、你知道資料庫緩衝池中的lru-list嗎?

一看就懂的SwitchHosts

switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...

一看就懂的氣泡排序

不用走啦,看得懂的啦!相鄰兩個數比較大小,較大的下沉 較小的上浮。從第乙個數開始,比較第乙個數和第二個數大小,如果第乙個數比第二個數大,則交換兩個數的位置,使大的數排在後面,依次比較第二個數和第三個數,使第三個數比第二和第乙個數大,直到倒數兩個數,將最大的數移動到最後一位。演算法分為兩個迴圈 1.外...

一看就懂的記憶體對齊

記憶體對齊對於程式設計師來說透明的,這是編譯器該做的事,將每個資料按排到合適的位置,這也是編譯器優化的結果。所以了解記憶體對齊的原理對於乙個程式設計師寫 是十分必要的,就不會導致大量的記憶體碎片產生。1 對於結構體的第乙個成員,將它在整個結構體在記憶體中分布的偏移量看成0,以後的每乙個資料成員的偏移...