【MySQL(七)】脏页
臟頁的定義是內存中和磁盤中的不一致頁。
那么臟頁是如何產生的?
在之前的介紹中,我們明白了innodb引擎是如何執行更新操作的。大致是:如果數據頁在內存中,直接更新內存并寫redo log;否則將磁盤中的數據頁載入到內存中,更新內存并寫redo log。所以當發生了更新操作并且數據頁在內存中時,磁盤的修改還沒有發生,而僅僅是記錄了redo log。這時,就會產生不一致的狀態。內存中的頁就被稱為臟頁。
臟頁有什么影響?
如果內存緩存不夠用了,那么根據buffer pool的lru淘汰機制,必然會淘汰老的數據頁。如果被淘汰的數據頁是臟頁,那么必須將其刷回磁盤。
為什么要刷回?
因為后面可能又會讀取該數據頁上的數據,如果被修改的數據還沒有被刷回磁盤,那么直接讀磁盤就讀不到最新的數據了,因為redo log可能沒有被執行。當然,你可以說將磁盤都的數據用redo log更新一下不就行了?這樣確實可以,但是這樣設計就會使得整個讀取流程過度復雜。mysql想要的一個狀態是:在讀取時,如果一個數據頁在內存中,那么它的值肯定是最新的;如果不在內存中,那么從磁盤中取到的值一定是最新的。這樣,整個流程理解起來更加簡單清晰。
那么除了淘汰內存頁,還有其他時機會刷臟頁嗎?
有的。其他實際:
1.redo log滿了,必須先將redo log寫入磁盤,寫入完后,內存和磁盤就一致了;
2.系統空閑時,系統會充分利用這段時間,自動刷臟頁;
3.系統關閉時;
?
總結
以上是生活随笔為你收集整理的【MySQL(七)】脏页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试遇到的问题
- 下一篇: 浏览器静态资源的版本控制新思路.强制更新