【MySQL(七)】髒頁

髒頁的定義是內存中和磁盤中的不一致頁。

那麼髒頁是如何產生的?

在之前的介紹中,我們明白了innodb引擎是如何執行更新操作的。大致是:如果數據頁在內存中,直接更新內存並寫redo log;否則將磁盤中的數據頁載入到內存中,更新內存並寫redo log。所以當發生了更新操作並且數據頁在內存中時,磁盤的修改還沒有發生,而僅僅是記錄了redo log。這時,就會產生不一致的狀態。內存中的頁就被稱爲髒頁。

髒頁有什麼影響?

如果內存緩存不夠用了,那麼根據buffer pool的lru淘汰機制,必然會淘汰老的數據頁。如果被淘汰的數據頁是髒頁,那麼必須將其刷回磁盤。

爲什麼要刷回?

因爲後面可能又會讀取該數據頁上的數據,如果被修改的數據還沒有被刷回磁盤,那麼直接讀磁盤就讀不到最新的數據了,因爲redo log可能沒有被執行。當然,你可以說將磁盤都的數據用redo log更新一下不就行了?這樣確實可以,但是這樣設計就會使得整個讀取流程過度複雜。mysql想要的一個狀態是:在讀取時,如果一個數據頁在內存中,那麼它的值肯定是最新的;如果不在內存中,那麼從磁盤中取到的值一定是最新的。這樣,整個流程理解起來更加簡單清晰。

那麼除了淘汰內存頁,還有其他時機會刷髒頁嗎?

有的。其他實際:

1.redo log滿了,必須先將redo log寫入磁盤,寫入完後,內存和磁盤就一致了;

2.系統空閒時,系統會充分利用這段時間,自動刷髒頁;

3.系統關閉時;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章