InnoDB 記憶體結構之更改緩衝區

来源:https://www.cnblogs.com/echo97/archive/2023/06/20/17494417.html
-Advertisement-
Play Games

更改緩衝區(Change Buffer)是一種特殊的數據結構,用於緩存不在緩衝池中的二級索引(secondary index)頁的更改。可能來自於 INSERT、UPDATE 或 DELETE 操作(數據操作語言,DML)的緩衝更改,會在後續通過其他讀操作將這些頁載入到緩衝池時被合併。 ...


更改緩衝區(Change Buffer)是一種特殊的數據結構,用於緩存不在緩衝池中的二級索引(secondary index)頁的更改。可能來自於INSERTUPDATEDELETE操作(數據操作語言,DML)的緩衝更改,會在後續通過其他讀操作將這些頁載入到緩衝池時被合併。

與聚簇索引(clustered indexes)不同,二級索引通常是不唯一的,並且對二級索引的插入操作以相對隨機的 順序發生。同樣地,刪除和更新操作可能會影響索引樹中不相鄰的二級索引頁。隨後當受影響的頁被其他操作讀入緩衝池時,合併緩存中的更改可以避免從磁碟讀取二級索引頁到緩衝池中所需的大量隨機訪問I/O。

在系統大部分處於空閑狀態或慢速關閉期間,會運行清理(purge)操作,定期將更新的索引頁寫入磁碟。與立即將每個值寫入磁碟相比,清理操作可以更高效地將索引值批量寫入磁碟。

當有大量受影響的行和需要更新的二級索引時,變更緩衝區的合併過程可能需要幾個小時。在此期間,磁碟 I/O 會增加,這可能導致磁碟密集型查詢明顯減慢。提交事務之後,甚至在伺服器關閉並重新啟動之後,變更緩衝區合併也可能會持續發生(請參閱“第 14.22.2 節“強制 InnoDB 恢復”瞭解更多信息)。

在記憶體中,變更緩衝區占用了緩衝池的一部分空間。在磁碟上,變更緩衝區是系統表空間的一部分,當資料庫伺服器關閉時,索引更改將存儲在其中。

變更緩衝區中緩存的數據類型由innodb_change_buffering變數控制。要瞭解更多信息,請參閱下文的”配置變更緩衝區“。您還可以配置最大變更緩衝區大小。要瞭解更多信息,請參閱下文的”配置最大變更緩衝區的大小“。

如果二級索引包含降序索引列,或者主鍵包含降序索引列,那麼變更緩衝區不支持對該二級索引進行緩衝。

有關變更緩衝區的常見問題的解答,請參見第 A.16 節“ MySQL 5.7 FAQ: InnoDB 變更緩衝區”

配置變更緩衝區

當對錶執行INSERTUPDATEDELETE操作時,索引列的值(尤其是二級鍵的值)通常是無序的,需要大量的 I/O 操作來更新二級索引。變更緩衝區會在相關頁面不在緩衝池中時緩存對二級索引條目的更改,從而通過不會立即從磁碟讀取頁面來避免昂貴的 I/O 操作。當頁面被載入到緩衝池時,緩衝中的更改將合併,更新後的頁面隨後會刷新到磁碟。在伺服器幾乎空閑或慢速關閉時,InnoDB主線程會合併緩衝中的更改。

由於變更緩衝區可以減少磁碟讀寫操作,因此它對於 I/O 密集型的工作負載最為有價值。例如,變更緩衝可以給頻繁進行 DML 操作(如批量插入)的應用程式帶來好處。

但是,變更緩衝區占用了緩衝池的一部分空間,從而減少了可用於緩存數據頁面的記憶體。如果工作集幾乎完全適應緩衝池,或者您的表具有相對較少的二級索引,禁用變更緩衝可能是有益的。如果工作數據集完全適合緩衝池,變更緩衝不會增加額外開銷,因為它僅適用於不在緩衝池中的頁面。

innodb_change_buffering變數控制著InnoDB執行變更緩衝的程度。您可以啟用或禁用插入操作、刪除操作(最初將索引記錄標記為刪除時)和清理操作(當索引記錄被物理刪除時)的緩衝。更新操作是插入操作和刪除操作的組合。innodb_change_buffering的預設值為all

  • all

    預設值:緩衝區插入,刪除標記操作和清除。

  • none

    不緩衝任何操作。

  • inserts

    緩衝插入操作。

  • deletes

    緩衝刪除標記操作。

  • changes

    緩衝插入和刪除標記操作。

  • purges

    緩衝後臺發生的物理刪除操作。

您可以在 MySQL 選項文件(my.cnfmy.ini)中設置innodb_change_buffering參數,或使用SET GLOBAL語句動態更改它,該語句需要足夠的許可權來設置全局系統變數。參見第 5.1.8.1 節“系統變數特權”。更改設置會影響新操作的緩衝;現有緩衝條目的合併不受影響。

您可以在 MySQL 的選項文件(my.cnfmy.ini)中設置innodb_change_buffering參數,或者使用SET GLOBAL語句動態更改它,該語句需要足夠的許可權來設置全局系統變數。請參閱第 5.1.8.1 節,“系統變數特權”。更改設置會影響新操作的緩衝,但不會影響現有緩衝條目的合併。

配置最大變更緩衝區的大小

innodb_change_buffer_max_size參數允許按照緩衝池總大小的百分比配置變更緩衝區的最大大小。預設情況下,innodb_change_buffer_max_size設置為 25。最大設置值為 50。

在 MySQL 伺服器上,如果存在大量的插入、更新和刪除活動,並且變更緩衝區合併無法跟上新的變更緩衝條目的速度,導致變更緩衝區達到了其最大大小限制,那麼可以考慮增加innodb_change_buffer_max_size

在 MySQL 伺服器上,如果數據是用於報告目的而基本靜態,或者如果變更緩衝區占用了與緩衝池共用的太多記憶體空間,導致頁面過早地從緩衝池中淘汰,那麼可以考慮減小innodb_change_buffer_max_size的值。

為了確定最佳配置,您可以使用一個代表性的工作負載來測試不同的設置。innodb_change_buffer_max_size參數是動態的,這意味著您可以在不重新啟動伺服器的情況下修改該設置。

監控變更緩衝區

以下選項可用於監控變更緩衝區:

  • InnoDB標準監視器輸出包括變更緩衝區的狀態信息。要查看監視器數據,請執行SHOW ENGINE INNODB STATUS語句。

    mysql> SHOW ENGINE INNODB STATUS\G
    

    變更緩衝區狀態信息位於INSERT BUFFER AND ADAPTIVE HASH INDEX標題下方,並且顯示類似以下內容:

    -------------------------------------
    INSERT BUFFER AND ADAPTIVE HASH INDEX
    -------------------------------------
    Ibuf: size 1, free list len 0, seg size 2, 0 merges
    merged operations:
     insert 0, delete mark 0, delete 0
    discarded operations:
     insert 0, delete mark 0, delete 0
    Hash table size 4425293, used cells 32, node heap has 1 buffer(s)
    13577.57 hash searches/s, 202.47 non-hash searches/s
    

    有關更多信息,請參閱第 14.18.3 節 “InnoDB 標準監視器和鎖監視器輸出”

  • Information SchemaINNODB_METRICS表提供了InnoDB標準監視器輸出中的大部分數據點以及其他數據點。要查看變更緩衝區指標及其描述,請執行以下查詢:

    mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G
    

    有關`INNODB_METRICS表用法情況的信息,請參見第 14.16.6 節“ InnoDB INFORMATION_SCHEMA Metrics Table”

  • Information SchemaINNODB_BUFFER_PAGE表提供了關於緩衝池中每個頁面的元數據,包括變更緩衝區索引和變更緩衝區點陣圖頁面。變更緩衝區頁面通過PAGE_TYPE進行標識。IBUF_INDEX是變更緩衝區索引頁的頁面類型,IBUF_BITMAP是變更緩衝區點陣圖頁的頁面類型。

    Waring:查詢INNODB_BUFFER_PAGE表可能會帶來顯著的性能開銷。為了避免影響性能,建議在測試實例上重現您要調查的問題,然後在測試實例上運行查詢。

    例如,您可以查詢INNODB_BUFFER_PAGE表,以確定IBUF_INDEXIBUF_BITMAP頁面在總緩衝池頁面中的近似比例。

    mysql> SELECT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
           WHERE PAGE_TYPE LIKE 'IBUF%') AS change_buffer_pages,
           (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE) AS total_pages,
           (SELECT ((change_buffer_pages/total_pages)*100))
           AS change_buffer_page_percentage;
    +---------------------+-------------+-------------------------------+
    | change_buffer_pages | total_pages | change_buffer_page_percentage |
    +---------------------+-------------+-------------------------------+
    |                  25 |        8192 |                        0.3052 |
    +---------------------+-------------+-------------------------------+
    

    有關INNODB_BUFFER_PAGE表提供的其他數據的信息,請參閱第 24.4.2 節 “INFORMATION_SCHEMA INNODB_BUFFER_PAGE Table”。有關相關使用信息,請參閱第 14.16.5 節 “InnoDB INFORMATION_SCHEMA緩衝池表”

  • Performance Schema為高級性能監控提供了變更緩衝區互斥鎖等待檢測。要查看變更緩衝區檢測,請執行以下查詢:

    mysql> SELECT * FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%wait/synch/mutex/innodb/ibuf%';
    +-------------------------------------------------------+---------+-------+
    | NAME                                                  | ENABLED | TIMED |
    +-------------------------------------------------------+---------+-------+
    | wait/synch/mutex/innodb/ibuf_bitmap_mutex             | YES     | YES   |
    | wait/synch/mutex/innodb/ibuf_mutex                    | YES     | YES   |
    | wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex | YES     | YES   |
    +-------------------------------------------------------+---------+-------+
    

    有關監視InnoDB互斥鎖等待的信息,請參閱第 14.17.2 節 “使用 Performance Schema 監視 InnoDB 互斥等待”

註:原文來自 MySQL 5.7 官方文檔,閱讀 MySQL 中文文檔時有些語句理解不順暢,便結合中文文檔使用 ChatGPT 進行了翻譯,如有不正請指出。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 一、概述 ### 1.什麼是多租戶架構? 多租戶架構是指在一個應用中支持多個租戶(Tenant)同時訪問,每個租戶擁有獨立的資源和數據,並且彼此之間完全隔離。通俗來說,多租戶就是把一個應用按照客戶的需求“分割”成多個獨立的實例,每個實例互不幹擾。 ### 2. 多租戶架構的優勢 - 更好地滿足 ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • ## 一:背景 ### 1. 講故事 前些天有位朋友找到我,說他的程式跑著跑著就崩潰了,讓我看下怎麼回事,其實沒怎麼回事,抓它的 crash dump 就好,具體怎麼抓也是被問到的一個高頻問題,這裡再補一下鏈接: [.NET程式崩潰了怎麼抓 Dump ? 我總結了三種方案] https://www. ...
  • `WPF`的依賴屬性是一項強大的功能,它允許我們創建可擴展、靈活和可重用的`UI`組件。通過依賴屬性,我們可以實現屬性的數據綁定、樣式化、動畫化以及屬性值的有效驗證和轉換。在本文中,我們介紹了幾個關鍵概念和用法,包括初始依賴屬性、自定義依賴屬性、只讀依賴屬性以及附加屬性。 ...
  • >原本只是想要每次打開終端,預設是 zsh ,方便使用 oh-my-zsh。但誰能料到這個配置有個史前大坑! ## 問題復現 頂部菜單欄的`終端` > 首選項配置:`未命名` > `命令` > 運行自定義命令 > 命令退出時:退出終端。 **只要這條命令出錯,或者執行完畢,就會結束退出了** (太痛 ...
  • ## 使用(微軟賬戶)進行遠程桌面連接 1. 打開找到[查看高級系統設置] -> [遠程] -> [遠程桌面]。 ![image](https://img2023.cnblogs.com/blog/3081210/202306/3081210-20230620213008346-1294112930 ...
  • logstash在需要收集日誌的伺服器里運行,將日誌數據發送給es 在kibana頁面查看es的數據 es和kibana安裝: Install Elasticsearch with RPM | Elasticsearch Guide [8.8] | Elastic Configuring Elast ...
  • ##[Ooonly新人貼]記錄工作中遇到的問題,話不多說先上乾貨 問題:類似K線與藍牙接收部門模塊,要求由原來的接收串口中斷改為DMA接收。據說要用到空閑中斷與DMA中斷,但是經模擬發現DMA每完成傳輸一個數據(比如1BYTE)就會進入空閑中斷(k線發現這種情況),考慮到這樣進入中斷的頻率和以前串口 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...