圖解MySQL(5)-Buffer Pool的flush鏈表
1 內存碎片

1.1 啥是BP的內存碎片?
BP劃分完全部緩存頁和描述信息塊后,還剩點內存,但卻再也放不下新的緩存頁。
1.2 如何減少內存碎片?
DB在BP中劃分緩存頁時,會讓所有緩存頁和描述信息塊都緊密挨一起,盡可能減少內存碎片。
2 臟數據頁
增刪改時,若發現數據頁沒緩存,就會從free鏈表找空閑緩存頁,讀取到BP的緩存頁,但若已緩存,則下次直接使用緩存頁。
所以你要更新的數據頁都會在BP緩存頁,讓你能在內存中直接執行增刪改。所以肯定會更新BP緩存頁數據,一旦更新了,則緩存頁數據和磁盤的數據頁數據,就不一致了,這時的BP緩存頁就是臟數據,即為臟頁。
2.1 哪些緩存頁是臟頁
最終這些在內存里更新的臟頁數據,都是要被刷回磁盤文件的。
但不可能所有緩存頁都刷盤,因為有的緩存頁可能因查詢而被讀取到BP,可能根本沒修改過!
于是DB引入flush鏈表,類似free鏈表,通過緩存頁的描述信息塊的兩個指針,讓被修改過的緩存頁的描述信息塊組成雙向鏈表。
被修改過的緩存頁,都會將其描述信息塊加入到flush鏈表中去,flush就是這些都是臟頁,后續都是要flush刷新到磁盤:
flush鏈表構造演示
比如緩存頁01被修改了數據,那他就是臟頁了,就加入flush鏈表。?現在flush鏈表的基礎節點就指向block01節點,接著比如緩存頁02被更新,他也是臟頁,那他的描述信息塊也要被加入flush鏈表。
可見,當你更新緩存頁時,通過變換緩存頁中的描述數據塊的flush鏈表的指針,就能將臟頁的描述數據塊組成一個雙向鏈表,即flush鏈表,而且flush鏈表的基礎節點會指向起始節點和尾巴節點。通過次flush鏈表,就能記錄下來哪些緩存頁是臟頁了。
Mysql 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。