好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > MySQL的Flush-List和臟頁的落盤機制

MySQL的Flush-List和臟頁的落盤機制

熱門標簽:信陽穩定外呼系統運營商 芒果電話機器人自動化 廣東人工電話機器人 南通自動外呼系統軟件 湖南人工外呼系統多少錢 百度地圖圖標標注中心 申請外呼電話線路 日照旅游地圖標注 石家莊電商外呼系統

一、回顧

MySQL啟動后Buffer Pool會初始化。Buffer Pool也會初始化好N多個空白的緩存頁,以及它們的描述數據會被組織成LRU鏈表以及FreeList 雙向鏈表。

這時你從磁盤中讀取一個數據頁,會先從Free List中找出一個空閑緩存頁的描述信息,然后將你讀出的數據頁中加載進緩存頁中。同時將緩存頁的描述信息從Free List中剔除,此外該描述信息塊還會被維護進LRU鏈表中。

數據頁被加載進Buffer Pool后你就可以對其進行變更操作了。

二、Flush List

為了加快響應客戶端的速度,MySQL會在Buffer Pool中對數據進行修改,可是一旦你對LRU鏈表中的緩存頁做了修改,那該頁中的數據和磁盤中的數據頁信息就不一致了!大家一般管這種數據頁叫做臟頁。

為了保證數據的最終一致性,MySQL是需要將臟頁刷新回磁盤的!

但是問題是:需要將哪些數據頁刷新回磁盤呢?

這就引出了Flush List~

Flush List 和 Free List很像,都是由Buffer Pool中數據描述信息組織而成的雙向鏈表。

一旦你對內存中的緩沖頁作出了修改,那該緩沖頁對應的描述信息塊就會添加進 Flush List。這樣當Buffer Pool中的數據頁不夠用時,我們就可以優先將 Flush List中的臟數據頁刷新進磁盤中。

如果你讀了前幾篇文章那你肯定知道了 LRUList、FreeList、FlushList、Buffer Pool、臟頁、臟數據。

下面乘勝追擊!一起看一下臟頁的落盤機制

三、什么是臟頁?什么是臟數據?

什么是臟頁?

我在介紹Flush List 的那篇文章有提及,臟頁就是LRU鏈表中被修改了的緩存頁。他們和磁盤中的數據頁不一致,臟頁是需要被刷新回磁盤的。

什么是臟數據?

這個問題其實引出了臟讀的概念。舉個例子:事物A中讀取到了事物B中未提交的數據,我們管這些數據叫做臟數據。

四、臟頁刷回磁盤的時機

當Buffer Pool不夠用時,根據LRU機制,MySQL會將Old SubList部分的緩存頁移出LRU鏈表。如果被移除出去的緩存頁的描述信息在Flush List中,MySQL就得將其刷新回磁盤。

InnoDB存儲引擎將臟頁刷回磁盤的時機有蠻多的,你可以把它當作拓展知識大概瀏覽一下。

1、當MySQL數據庫關閉時,會將所有的臟數據頁刷新回磁盤。這個功能由參數:innodb_fast_shutdown=0控制,默認讓InnoDB在關閉前將臟頁刷回磁盤,以及清理掉undo log。

2、有一個后臺線程Master Thread會按照每秒或者每十秒的速度,異步的將Buffer Pool中一定比例的頁面刷新回磁盤中。

3、在MySQL5.7中,Buffer Pool的刷新由page cleaner threads完成。

我們可以通過innodb_page_cleaners參數控制page cleaner threads線程的數量,但是當你將這個數值調整的比Buffer Pool的數量還大時,MySQL會自動將 innodb_page_cleaners數量設置為innodb_buffer_pool_instances的數量。
Innodb1.1.x之前需要保證LRU列表中有至少100個空閑頁可以使用。低于這個閾值就會觸發臟頁的刷新。
從MySQL5.6,也就是innodb1.2.X開始,innodb_lru_scan_depth參數為每個緩沖池實例指定page cleaner threads 掃描Buffer Pool來查找要刷新的臟頁的下行距離。默認為1024,該后臺線程每秒都會執行一次。
4、當臟數據頁太多時,也會觸發將臟數據頁刷新回磁盤。該機制可由參數innodb_nax_dirty_pages_pct控制,比如將其設置為75,表示,當Buffer Pool中的臟數據頁達到整體緩存的75%時,觸發刷新的動作。現實情況是該參數默認值為0。以此來禁用Buffer Pool早期的刷新行為。

5、當redo log不可用時,也會強制臟頁列表中的臟頁刷新回磁盤。這個機制同樣由一個后臺線程完成。

五、其他關于臟頁刷新的知識點

刷新臨接數據頁:意思是當MySQL將某臟頁刷新回磁盤時,是否也以相同的態度將該臟頁鄰接的臟頁一并刷新回磁盤。

可以通過參數innodb_flush_neighbors控制該過程。

  • 設置為0時表示,禁用刷新鄰接的功能。
  • 設置為1時表示,以相同的態度刷新其鄰接的臟頁。
  • 設置為2時表示,以相同的程度刷新臟頁。

那如何選擇將其設置為哪種狀態呢?

你可以根據MySQL實例所在機器的存儲類型來決定。如果為HDD存儲建議將其開啟,因為HDD的磁盤刷新速率較低,開啟該參數后可以有效的減少IO操作。相反如果使用SSD存儲,其本身就有高磁盤IO的特性,建議禁用該參數。

以上就是MySQL的Flush-List和臟頁的落盤機制的詳細內容,更多關于MySQL Flush-List和臟頁的落盤機制的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Mysql臟頁flush及收縮表空間原理解析
  • mysql臟頁是什么

標簽:公主嶺 天津 阿里 呼和浩特 惠州 牡丹江 沈陽 合肥

巨人網絡通訊聲明:本文標題《MySQL的Flush-List和臟頁的落盤機制》,本文關鍵詞  MySQL,的,Flush-List,和,臟頁,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL的Flush-List和臟頁的落盤機制》相關的同類信息!
  • 本頁收集關于MySQL的Flush-List和臟頁的落盤機制的相關信息資訊供網民參考!
  • 推薦文章