首頁  >  文章  >  資料庫  >  mysql髒頁指的是什麼

mysql髒頁指的是什麼

王林
王林轉載
2023-05-30 12:01:451186瀏覽

如果在 MySQL 中記憶體資料頁和磁碟資料頁的內容不同,那麼這塊記憶體頁會被稱為髒頁。刷髒頁的場景:1、當redo log寫滿,mysql就會暫停所有更新操作,將同步這部分日誌對應的髒頁同步到磁碟;2、系統記憶體不足時,需要淘汰一部分資料頁,如果淘汰的是髒頁,就要先將髒頁同步到磁碟;3、MySQL認為系統空閒的時候,有機會就同步記憶體資料到磁碟,這種沒有效能問題。

髒頁(記憶體頁)

  • #乾淨頁:記憶體與磁碟中的資料一致

  • #髒頁:記憶體和磁碟中的資料不一致

為什麼會出現髒頁

平常很快的更新操作,都是在寫記憶體和日誌。 他並不會馬上同步到磁碟資料頁,這時記憶體資料頁跟磁碟資料頁內容不一致,我們稱之為髒頁

這裡面就涉及 mysql 的記憶體管理機制

記憶體管理機制簡述

緩衝區中包含這三大類別清單。分別為:LRUListFreeListFlushList

在資料庫剛啟動時,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過大。

刷髒頁有下面4種場景

undefined會造成的影響

如果是redo log 寫滿了

要盡量避免redo log 寫滿。否則整個系統的更新都會停止。 此時寫的效能變成 0,必須等待該日誌對應髒頁同步完成後才能更新,這時就會導致 sql 語句 執行的很慢。

以上是mysql髒頁指的是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除