主頁 > 後端開發 > InnoDB 緩沖池

InnoDB 緩沖池

2023-06-20 08:10:44 後端開發

緩沖池是主存盤器中的一個區域,在訪問 table 和索引資料時InnoDB會對其進行快取,緩沖池允許直接從記憶體中訪問頻繁使用的資料,從而加快處理速度,在專用服務器上,通常將高達 80% 的物理記憶體分配給緩沖池,

為了高效處理大量讀取操作,緩沖池被劃分為可以容納多行資料的頁面,為了有效管理快取,緩沖池被實作為頁面的鏈接串列;通過 LRU(least recently used)演算法的變體將很少使用的資料從快取中淘汰出去,

了解如何利用緩沖池將頻繁訪問的資料保留在記憶體中是MySQL調優的重要方面之一,

緩沖池 LRU 演算法

緩沖池使用一種最近最少使用(LRU)演算法的變體作為串列進行管理,當需要空間以將新頁面添加到緩沖池時,最近最少使用的頁面會被移除,并將新頁面添加到串列的中間,這種中點插入策略將串列視為兩個子串列:

  • 在前面是最近訪問過的新("young")頁面的子串列;
  • 在尾部是最近較少被訪問的舊("old")頁面子串列,

緩沖池串列如下圖所示:

該演算法將頻繁使用的頁面保留在新頁面子串列中,舊頁面子串列則包含較少被使用的頁面,這些頁面是可能被淘汰(eviction)的候選頁面,

默認情況下,演算法運行如下:

  • 緩沖池的 3/8 專門用于舊頁面子串列,
  • 串列的中點是新頁面子串列的尾部與舊頁面子串列的頭部相遇的邊界位置,
  • InnoDB將一個頁面讀入緩沖池時,它最扯訓插入到中點位置(舊頁面子串列的頭部),一個頁面可以被讀取,因為它是用戶發起的操作(例如 SQL 查詢)所必需的,或者是InnoDB自動執行的預讀(read-ahead)操作的一部分,
  • 訪問舊頁面子串列中的一個頁面會使其變為"young",并將其移動到新頁面子串列的開頭,如果頁面由于用戶發起的操作而被讀取,則將立即進行首次訪問,并且頁面會被標記為"young",如果頁面是由于預讀操作而被讀取,則第一次訪問不會立即發生,并且在該頁面被淘汰之前可能根本不會發生,
  • 隨著資料庫的運行,緩沖池中未被訪問的頁面會通過向串列的尾部移動而"老化",新頁面子串列和舊頁面子串列中的頁面都會隨著其他頁面的更新而老化,舊頁面子串列中的頁面也會隨著在中點插入頁面而老化,最終,一個長時間未被使用的頁面會到達舊頁面子串列的尾部并被淘汰,

默認情況下,通過查詢讀取的頁面會立即移動到新頁面子串列中,這意味著它們在緩沖池中停留的時間更長,例如,對于執行mysqldump操作或不帶WHERE子句的SELECT陳述句進行的表掃描,可能會將大量資料帶入緩沖池,并淘汰相同數量的較舊資料,即使新資料永遠不會再次使用,同樣地,由預讀取后臺執行緒加載且僅訪問一次的頁面會移動到新頁面子串列的開頭,這些情況會將頻繁使用的頁面推入舊頁面子串列,使其面臨淘汰的風險,關于優化這種行為的資訊,請參閱"使緩沖池具有掃描抵抗力"和"配置 InnoDB 緩沖池預取(預讀)",

InnoDB標準監視器(Standard Monitor)的輸出在BUFFER POOL AND MEMORY部分中包含了幾個與緩沖池 LRU 演算法操作有關的欄位,有關詳細資訊,請參閱使用 InnoDB 標準監視器監控緩沖池,

緩沖區配置

您可以配置緩沖池的各個方面以提高性能,

  • 理想情況下,您應該將緩沖池的大小設定為盡可能大的值,同時確保為服務器上的其他行程留有足夠的記憶體,以避免過多的頁面交換(paging),緩沖池越大,InnoDB就更像是一個記憶體資料庫,從磁盤讀取一次資料,然后在后續讀取從記憶體中訪問資料,有關詳細資訊,請參閱"配置 InnoDB 緩沖池大小",
  • 在具有足夠記憶體的64位系統上,可以將緩沖池分成多個部分,以最大程度地減少并發操作之間對記憶體結構的爭用,有關詳細資訊,請參閱"配置多個緩沖池實體",
  • 您可以將頻繁訪問的資料保留在記憶體中,而不受會將大量不經常訪問的資料帶入緩沖池的操作突然活動的影響,有關詳細資訊,請參閱"使緩沖池具有掃描抵抗力",
  • 您可以控制何時以及如何執行預讀請求,以異步方式將頁面預取到緩沖池中,從而期望這些頁面很快會被使用,有關詳細資訊,請參閱"配置 InnoDB 緩沖池預取(預讀)",
  • 您可以控制何時進行后臺重繪,以及是否根據作業負載動態調整重繪速率,有關詳細資訊,請參閱"配置緩沖池重繪",
  • 您可以配置InnoDB保存當前的緩沖池狀態的方式,以避免服務器重新啟動后的漫長預熱時間,有關詳細資訊,請參閱"保存和恢復緩沖池狀態",

使用 InnoDB 標準監視器監控緩沖池

可以使用SHOW ENGINE INNODB STATUS訪問InnoDB標準監視器輸出提供的有關緩沖池操作的指標,緩沖池指標位于InnoDB標準監視器輸出的BUFFER POOL AND MEMORY部分:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 776332
Buffer pool size   131072
Free buffers       124908
Database pages     5720
Old database pages 2071
Modified db pages  910
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 4, not young 0
0.10 youngs/s, 0.00 non-youngs/s
Pages read 197, created 5523, written 5060
0.00 reads/s, 190.89 creates/s, 244.94 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not
0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read
ahead 0.00/s
LRU len: 5720, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

下表描述了InnoDB標準監視器報告的緩沖池指標,

注:InnoDB標準監視器輸出中提供的每秒平均值是基于自上次列印InnoDB標準監視器輸出以來經過的時間計算的,

InnoDB 緩沖池指標如下表所示:

Name Description
Total memory allocated 為緩沖池分配的總記憶體(以位元組為單位),
Dictionary memory allocated InnoDB資料字典分配的總記憶體(以位元組為單位),
Buffer pool size 分配給緩沖池的頁面總大小,
Free buffers 緩沖池空閑串列的頁面總大小,
Database pages 緩沖池 LRU 串列的頁面總大小,
Old Database pages 緩沖池舊 LRU 子串列的頁面總大小,
Modified db pages 當前在緩沖池中修改的頁面數,
Pending reads 等待讀入緩沖池的緩沖池頁面數,
Pending writes LRU 從 LRU 串列底部等待寫入緩沖池中舊臟頁的數量,
Pending writes flush list 檢查點期間要重繪的緩沖池頁面數,
Pending writes single page 緩沖池中暫掛的獨立頁面寫入數,
Pages made young 緩沖池 LRU 串列中變年輕的頁面總數(移至“新”頁面的子串列的開頭),
Pages made not young 緩沖池 LRU 串列中沒有變年輕的頁面總數(保留在“舊”頁面子串列中沒有年輕的頁面),
youngs/s 在緩沖池 LRU 串列中,平均每秒訪問舊頁面并使其變為年輕頁面的次數,有關更多資訊,請參閱此表格后面的注釋,
non-youngs/s 在緩沖池 LRU 串列中,平均每秒訪問舊頁面并未導致頁面變為年輕頁面的次數,有關更多資訊,請參閱此表格后面的注釋,
Pages read 從緩沖池讀取的頁面總數,
Pages created 在緩沖池中創建的頁面總數,
Pages written 從緩沖池寫入的頁面總數,
reads/s 平均每秒讀取的緩沖池頁面數,
creates/s 平均每秒創建的緩沖池頁面數,
writes/s 平均每秒緩沖池頁面寫入數,
Buffer pool hit rate 從緩沖池讀取的頁面與從磁盤存盤讀取的頁面之間的緩沖池頁面命中率,
young-making rate 頁面訪問導致頁面變為年輕頁面的平均命中率,有關更多資訊,請參閱此表格后面的注釋,
not (young-making rate) 頁面訪問未使頁面變年輕的平均命中率,有關更多資訊,請參見此表格后面的注釋,
Pages read ahead 平均每秒的預讀操作次數,
Pages evicted without access 平均每秒從緩沖池中淘汰而被訪問的頁面數量,
Random read ahead 平均每秒隨機預讀操作次數,
LRU len 緩沖池 LRU 串列的頁面總大小,
unzip_LRU len 緩沖池 unzip_LRU 串列的長度(以頁面為單位),
I/O sum 訪問的緩沖池 LRU 串列頁面總數,
I/O cur 當前間隔內訪問的緩沖池 LRU 串列頁面總數,
I/O unzip sum 已訪問的緩沖池 unzip_LRU 串列頁面的總數,
I/O unzip cur 當前時間間隔內已訪問的緩沖池 unzip_LRU 串列頁面的總數,

Notes

  • 年輕頁面生成速率youngs/s指標僅適用于舊頁面,它基于頁面的訪問次數而不是頁面數計算,對于給定頁面,可能會有多次訪問,所有訪問都會被計算在內,如果在沒有進行大規模掃描的情況下youngs/s非常低,則可能需要減少延遲時間或增加用于舊子串列的緩沖池百分比,增加百分比會使舊子串列變大,因此需要更長的時間才能將該子串列中的頁面移動到尾部,從而增加這些頁面再次被訪問并成為年輕頁面的可能性,請參閱“使緩沖池抗掃描”,

  • 非年輕頁面生成速率non-youngs/s指標僅適用于舊頁面,它基于頁面的訪問次數而不是頁面數計算,對于給定頁面,可能會有多次訪問,所有訪問都會被計算在內,如果在執行大型表掃描(以及較高的youngs/s)時沒有看到更高的非年輕頁面生成速率值non-youngs/s,請增加延遲值,請參閱“使緩沖池抗掃描”,

  • 年輕頁面生成率young-making考慮了所有緩沖池頁面的訪問,而不僅僅是舊子串列中頁面的訪問,年輕頁面生成率young-making和非年輕頁面生成率non-youngs/s通常不會累加到整體緩沖池命中率上,在舊子串列中的頁面命中會導致頁面移動到新子串列,但是新子串列中的頁面命中只有當它們距離串列頭部一定距離時才會移動到串列頭部,

  • 非(年輕頁面生成率)not (young-making rate)是指由于未達到由innodb_old_blocks_time定義的延遲時間,或由于新子串列中的頁面命中未導致頁面移動到頭部,而導致頁面訪問未使頁面變為年輕頁面的平均命中率,此率考慮了所有緩沖池頁面的訪問,而不僅僅是舊子串列中頁面的訪問,

緩沖池服務器狀態變數和INNODB_BUFFER_POOL_STATS表提供了許多與InnoDB Standard Monitor 輸出中相同的緩沖池指標,有關更多資訊,請參閱示例“查詢INNODB_BUFFER_POOL_STATS table”,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555557.html

標籤:其他

上一篇:現代C++學習指南-標準庫

下一篇:返回列表

標籤雲
其他(161278) Python(38242) JavaScript(25505) Java(18249) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7258) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4603) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1968) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • InnoDB 緩沖池

    緩沖池是主存盤器中的一個區域,在訪問 table 和索引資料時 InnoDB 會對其進行快取。緩沖池允許直接從記憶體中訪問頻繁使用的資料,從而加快處理速度。在專用服務器上,通常將高達 80% 的物理記憶體分配給緩沖池。 ......

    uj5u.com 2023-06-20 08:10:44 more
  • 現代C++學習指南-標準庫

    > 在[上一章](https://www.yuque.com/docs/share/adb5b1e4-f3c6-46fd-ba4b-4dabce9b4f2a?# 《現代C++學習指南-型別系統》)我們探討了C++的型別系統,并提出了從低到高,又從高到低的學習思路,本文就是一篇從高到低的學習指南,希望 ......

    uj5u.com 2023-06-20 08:10:38 more
  • Python 標準類別庫-并發執行之multiprocessing-基于行程的并行

    ### 實踐環境 Python3.6 ### 介紹 `multiprocessing`是一個支持使用類似于執行緒模塊的API派生行程的包。該包同時提供本地和遠程并發,通過使用子行程而不是執行緒,有效地避開了全域解釋器鎖。因此,`multiprocessing`模塊允許程式員充分利用給定機器上的多個處理器 ......

    uj5u.com 2023-06-20 08:05:22 more
  • Manacher演算法學習筆記

    # Manacher演算法是什么 ~~Manacher演算法就是馬拉車。~~ Manacher演算法就是用于解決回文子串的個數的。 # 問題引入 [P3805:【模板】manacher 演算法](https://www.luogu.com.cn/problem/P3805) # 題目大意 給出一個只由小寫英 ......

    uj5u.com 2023-06-20 08:00:12 more
  • 前端學習C語言 - 函式和關鍵字

    ## 函式和關鍵字 本篇主要介紹:`自定義函式`、`宏函式`、`字串處理函式`和`關鍵字`。 ### 自定義函式 #### 基本用法 實作一個 add() 函式。請看示例: ```c #include // 自定義函式,用于計算兩個整數的和 int add(int a, int b) { // a ......

    uj5u.com 2023-06-20 08:00:07 more
  • Rust語言 - 介面設計的建議之顯而易見(Obvious)

    # Rust語言 - 介面設計的建議之顯而易見(Obvious) - [Rust API 指南 GitHub](https://github.com/rust-lang/api-guidelines): - [Rust API 指南 中文](https://rust-chinese-translat ......

    uj5u.com 2023-06-20 08:00:02 more
  • java后端接入微信小程式登錄功能

    # 前言 此文章是Java后端接入微信登錄功能,由于專案需要,舍棄了解密用戶資訊的`session_key`,只保留`openid`用于檢索用戶資訊 后端框架:spring boot 小程式框架:uniapp # 流程概括 - 官方流程:通過自定義登錄態與openid,session_key關聯,之 ......

    uj5u.com 2023-06-20 07:59:54 more
  • 一種實作Spring動態資料源切換的方法

    ## 1 目標 不在現有查詢代碼邏輯上做任何改動,實作dao維度的資料源切換(即表維度) ## 2 使用場景 節約bdp的集群資源。接入新的寬表時,通常uat驗證后就會停止集群釋放資源,在對應的查詢服務器uat環境時需要查詢的是生產庫的表資料(uat庫表因為bdp實時任務停止,沒有資料落入),只進行 ......

    uj5u.com 2023-06-20 07:59:44 more
  • java~搞懂Comparable介面的compareTo方法

    `Comparable` 介面的 `compareTo` 方法的升序或降序取決于實作該介面的類的具體實作。按照慣例,`compareTo` 方法應該回傳負數、零或正數來指示當前物件是小于、等于還是大于傳入的物件。具體來說: - 如果 `this` 物件小于傳入的物件,則 `compareTo` 應該 ......

    uj5u.com 2023-06-20 07:59:36 more
  • ElasticSearch的使用和介紹

    # 1、概述 ## 功能 Elasticsearch 是一個分布式的 RESTful 搜索和分析引擎,可用來集中存盤您的資料,以便您對形形色色、規模不一的資料進行搜索、索引和分析。 例如: - 在電商網站搜索商品 ![image](https://img2023.cnblogs.com/blog/3 ......

    uj5u.com 2023-06-20 07:54:11 more