如果在 MySQL 中記憶體資料頁和磁碟資料頁的內容不同,那麼這塊記憶體頁會被稱為髒頁。刷髒頁的場景:1、當redo log寫滿,mysql就會暫停所有更新操作,將同步這部分日誌對應的髒頁同步到磁碟;2、系統記憶體不足時,需要淘汰一部分資料頁,如果淘汰的是髒頁,就要先將髒頁同步到磁碟;3、MySQL認為系統空閒的時候,有機會就同步記憶體資料到磁碟,這種沒有效能問題。
#乾淨頁:記憶體與磁碟中的資料一致
#髒頁:記憶體和磁碟中的資料不一致
平常很快的更新操作,都是在寫記憶體和日誌。
他並不會馬上同步
到磁碟資料頁,這時記憶體資料頁跟磁碟資料頁內容不一致,我們稱之為髒頁
。
這裡面就涉及 mysql 的記憶體管理機制
緩衝區中包含這三大類別清單。分別為:LRUList
、FreeList
、FlushList
。
在資料庫剛啟動時,LRUlist中沒有資料頁
。 FreeList存放空閒頁。
當需要讀取某個頁時,會從FreeList取得空閒頁,讀入資料後,放入LRUlist中
如果FreeList中沒有空閒頁了,那麼根據LRU演算法淘汰Lru列表中末位的頁
#當LRUlist中的頁被修改後,頁就變成了髒頁,這個頁也會被加入FlushList中
注意:這時這個頁既在LRUlist中,又在FlushList中。
總結:LRUList(管理已經被讀取的頁)和FreeList(管理空閒的頁)用來管理頁的可用性;FlushList(管理髒頁)用來管理髒頁的刷新
在髒頁資料同步到磁碟過程中,如果對該磁碟資料頁執行SQL 語句。執行速度就會變慢
假如只有快取區用來進行資料修改和讀取,一旦資料庫宕機,快取區中的資料將會遺失。因此,MySQL利用之前介紹過的redo日誌來實現在異常重啟時的資料復原。
以簡單的方式解釋,就是在更新緩衝區之前,將操作記錄在redo log中,以確保在出現異常重啟的情況下,仍然可以恢復緩衝區中的資料。
上面說了資料只放在緩衝區,會出現資料庫宕機,記憶體資料遺失
。所以需要刷新到磁碟。
redo log如果無限大或有許多個檔案的話,系統中有大量的修改操作,一旦宕機,恢復的時間也會非常長。
所以自然而然,我們就一定需要把記憶體中的髒頁按照某種規則刷新到磁碟中,有了刷新這個操作,緩衝區的大小問題和redo log的大小問題都可以解決。
緩衝區不需要無限大了,因為可以持久化到磁碟
因為一旦redo log中的資料持久化到磁碟上,對應的部分資料就可以被釋放,所以不需要設定redo log過大。
undefined會造成的影響
如果是redo log 寫滿了
要盡量避免redo log 寫滿
。否則整個系統的更新都會停止。 此時寫的效能變成 0
,必須等待該日誌對應髒頁同步完成
後才能更新,這時就會導致 sql 語句 執行的很慢。
以上是mysql髒頁指的是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!