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

InnoDB 緩沖池

2023-06-20 07:33:00 後端開發

緩沖池是主存盤器中的一個區域,在訪問 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/555539.html

標籤:Java

上一篇:深入理解Go語言介面

下一篇:返回列表

標籤雲
其他(161265) Python(38240) JavaScript(25505) Java(18247) 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 07:33:00 more
  • 深入理解Go語言介面

    # 1. 引言 介面是一種定義了軟體組件之間互動規范的重要概念,其促進了代碼的解耦、模塊化和可擴展性,提供了多型性和抽象的能力,簡化了依賴管理和替換,方便進行單元測驗和集成測驗。這些特性使得介面成為構建可靠、可維護和可擴展的軟體系統的關鍵工具之一。 在現代編程語言中,介面是不可或缺的一個重要特性。本 ......

    uj5u.com 2023-06-19 08:33:43 more
  • 【QCustomPlot】使用方法(動態庫方式)

    使用 QCustomPlot 繪圖庫輔助開發時整理的學習筆記。本篇介紹 QCustomPlot 的一種使用方法,通過動態庫的方式進行使用,示例中使用的 QCustomPlot 版本為 Version 2.1.1。 ......

    uj5u.com 2023-06-19 08:33:38 more
  • 深入理解Go語言介面

    # 1. 引言 介面是一種定義了軟體組件之間互動規范的重要概念,其促進了代碼的解耦、模塊化和可擴展性,提供了多型性和抽象的能力,簡化了依賴管理和替換,方便進行單元測驗和集成測驗。這些特性使得介面成為構建可靠、可維護和可擴展的軟體系統的關鍵工具之一。 在現代編程語言中,介面是不可或缺的一個重要特性。本 ......

    uj5u.com 2023-06-19 08:32:27 more
  • 【QCustomPlot】使用方法(動態庫方式)

    使用 QCustomPlot 繪圖庫輔助開發時整理的學習筆記。本篇介紹 QCustomPlot 的一種使用方法,通過動態庫的方式進行使用,示例中使用的 QCustomPlot 版本為 Version 2.1.1。 ......

    uj5u.com 2023-06-19 08:31:51 more
  • JavaCV的攝像頭實戰之八:人臉檢測

    ### 歡迎訪問我的GitHub > 這里分類和匯總了欣宸的全部原創(含配套原始碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《JavaCV的攝像頭實戰》的第八 ......

    uj5u.com 2023-06-19 07:39:15 more
  • 使用 Sa-Token 實作 [記住我] 模式登錄、七天免登錄

    ### 一、需求分析 如圖所示,一般網站的登錄界面都會有一個 **`[記住我]`** 按鈕,當你勾選它登錄后,即使你關閉瀏覽器再次打開網站,也依然會處于登錄狀態,無須重復驗證密碼: ![../static/login-view.png](https://oss.dev33.cn/sa-token/d ......

    uj5u.com 2023-06-19 07:39:02 more
  • C++基礎知識總結

    > 2023/6/18 > > 本篇章記錄學習程序C++的基礎概念和代碼測驗實作,還有很多需要補充。一是還不清楚,二是還沒有學到。打算學習程序中后面再做補充。先看完《C++primer 》書之后再慢慢來添加補充 # 1.函式多載 1. 一個函式名可以實作多個功能,這取決于函式引數不同來實作判斷對應的 ......

    uj5u.com 2023-06-19 07:38:55 more
  • Java Websocket 01: 原生模式 Websocket 基礎通信

    原生模式下, 服務端通過 @ServerEndpoint 實作其對應的 @OnOpen, @OnClose, @OnMessage, @OnError 方法, 客戶端創建 WebSocketClient 實作對應的 onOpen(), onClose(), onMessage(), onError(... ......

    uj5u.com 2023-06-19 07:38:50 more
  • Scala集合

    # 集合 scala中的集合分為兩種 ,可變集合和不可變集合, 不可變集合可以安全的并發的訪問! 集合的類主要在一下兩個包中 - 可變集合包 scala.collection.mutable - 不可變集合包 scala.collection.immutable 默認的 Scala 不可變集合,就是 ......

    uj5u.com 2023-06-19 07:38:42 more