髒頁的定義是內存中和磁盤中的不一致頁。
那麼髒頁是如何產生的?
在之前的介紹中,我們明白了innodb引擎是如何執行更新操作的。大致是:如果數據頁在內存中,直接更新內存並寫redo log;否則將磁盤中的數據頁載入到內存中,更新內存並寫redo log。所以當發生了更新操作並且數據頁在內存中時,磁盤的修改還沒有發生,而僅僅是記錄了redo log。這時,就會產生不一致的狀態。內存中的頁就被稱爲髒頁。
髒頁有什麼影響?
如果內存緩存不夠用了,那麼根據buffer pool的lru淘汰機制,必然會淘汰老的數據頁。如果被淘汰的數據頁是髒頁,那麼必須將其刷回磁盤。
爲什麼要刷回?
因爲後面可能又會讀取該數據頁上的數據,如果被修改的數據還沒有被刷回磁盤,那麼直接讀磁盤就讀不到最新的數據了,因爲redo log可能沒有被執行。當然,你可以說將磁盤都的數據用redo log更新一下不就行了?這樣確實可以,但是這樣設計就會使得整個讀取流程過度複雜。mysql想要的一個狀態是:在讀取時,如果一個數據頁在內存中,那麼它的值肯定是最新的;如果不在內存中,那麼從磁盤中取到的值一定是最新的。這樣,整個流程理解起來更加簡單清晰。
那麼除了淘汰內存頁,還有其他時機會刷髒頁嗎?
有的。其他實際:
1.redo log滿了,必須先將redo log寫入磁盤,寫入完後,內存和磁盤就一致了;
2.系統空閒時,系統會充分利用這段時間,自動刷髒頁;
3.系統關閉時;