更改緩沖區(qū)(Change Buffer)是一種特殊的數(shù)據(jù)結(jié)構(gòu),用于緩存不在緩沖池中的二級索引(secondary index)頁的更改??赡軄碜杂?code>INSERT、UPDATE
或DELETE
操作(數(shù)據(jù)操作語言,DML)的緩沖更改,會在后續(xù)通過其他讀操作將這些頁加載到緩沖池時被合并。
與聚簇索引(clustered indexes)不同,二級索引通常是不唯一的,并且對二級索引的插入操作以相對隨機(jī)的 順序發(fā)生。同樣地,刪除和更新操作可能會影響索引樹中不相鄰的二級索引頁。隨后當(dāng)受影響的頁被其他操作讀入緩沖池時,合并緩存中的更改可以避免從磁盤讀取二級索引頁到緩沖池中所需的大量隨機(jī)訪問I/O。
在系統(tǒng)大部分處于空閑狀態(tài)或慢速關(guān)閉期間,會運行清理(purge)操作,定期將更新的索引頁寫入磁盤。與立即將每個值寫入磁盤相比,清理操作可以更高效地將索引值批量寫入磁盤。
當(dāng)有大量受影響的行和需要更新的二級索引時,變更緩沖區(qū)的合并過程可能需要幾個小時。在此期間,磁盤 I/O 會增加,這可能導(dǎo)致磁盤密集型查詢明顯減慢。提交事務(wù)之后,甚至在服務(wù)器關(guān)閉并重新啟動之后,變更緩沖區(qū)合并也可能會持續(xù)發(fā)生(請參閱“第 14.22.2 節(jié)“強(qiáng)制 InnoDB 恢復(fù)”了解更多信息)。
在內(nèi)存中,變更緩沖區(qū)占用了緩沖池的一部分空間。在磁盤上,變更緩沖區(qū)是系統(tǒng)表空間的一部分,當(dāng)數(shù)據(jù)庫服務(wù)器關(guān)閉時,索引更改將存儲在其中。
變更緩沖區(qū)中緩存的數(shù)據(jù)類型由innodb_change_buffering
變量控制。要了解更多信息,請參閱下文的”配置變更緩沖區(qū)“。您還可以配置最大變更緩沖區(qū)大小。要了解更多信息,請參閱下文的”配置最大變更緩沖區(qū)的大小“。
如果二級索引包含降序索引列,或者主鍵包含降序索引列,那么變更緩沖區(qū)不支持對該二級索引進(jìn)行緩沖。
有關(guān)變更緩沖區(qū)的常見問題的解答,請參見第 A.16 節(jié)“ MySQL 5.7 FAQ: InnoDB 變更緩沖區(qū)”。
配置變更緩沖區(qū)
當(dāng)對表執(zhí)行INSERT
、UPDATE
和DELETE
操作時,索引列的值(尤其是二級鍵的值)通常是無序的,需要大量的 I/O 操作來更新二級索引。變更緩沖區(qū)會在相關(guān)頁面不在緩沖池中時緩存對二級索引條目的更改,從而通過不會立即從磁盤讀取頁面來避免昂貴的 I/O 操作。當(dāng)頁面被加載到緩沖池時,緩沖中的更改將合并,更新后的頁面隨后會刷新到磁盤。在服務(wù)器幾乎空閑或慢速關(guān)閉時,InnoDB
主線程會合并緩沖中的更改。
由于變更緩沖區(qū)可以減少磁盤讀寫操作,因此它對于 I/O 密集型的工作負(fù)載最為有價值。例如,變更緩沖可以給頻繁進(jìn)行 DML 操作(如批量插入)的應(yīng)用程序帶來好處。
但是,變更緩沖區(qū)占用了緩沖池的一部分空間,從而減少了可用于緩存數(shù)據(jù)頁面的內(nèi)存。如果工作集幾乎完全適應(yīng)緩沖池,或者您的表具有相對較少的二級索引,禁用變更緩沖可能是有益的。如果工作數(shù)據(jù)集完全適合緩沖池,變更緩沖不會增加額外開銷,因為它僅適用于不在緩沖池中的頁面。
innodb_change_buffering
變量控制著InnoDB
執(zhí)行變更緩沖的程度。您可以啟用或禁用插入操作、刪除操作(最初將索引記錄標(biāo)記為刪除時)和清理操作(當(dāng)索引記錄被物理刪除時)的緩沖。更新操作是插入操作和刪除操作的組合。innodb_change_buffering
的默認(rèn)值為all
。
-
all
默認(rèn)值:緩沖區(qū)插入,刪除標(biāo)記操作和清除。
-
none
不緩沖任何操作。
-
inserts
緩沖插入操作。
-
deletes
緩沖刪除標(biāo)記操作。
-
changes
緩沖插入和刪除標(biāo)記操作。
-
purges
緩沖后臺發(fā)生的物理刪除操作。
您可以在 MySQL 選項文件(my.cnf
或my.ini
)中設(shè)置innodb_change_buffering參數(shù),或使用SET GLOBAL語句動態(tài)更改它,該語句需要足夠的權(quán)限來設(shè)置全局系統(tǒng)變量。參見第 5.1.8.1 節(jié)“系統(tǒng)變量特權(quán)”。更改設(shè)置會影響新操作的緩沖;現(xiàn)有緩沖條目的合并不受影響。
您可以在 MySQL 的選項文件(my.cnf
或my.ini
)中設(shè)置innodb_change_buffering
參數(shù),或者使用SET GLOBAL
語句動態(tài)更改它,該語句需要足夠的權(quán)限來設(shè)置全局系統(tǒng)變量。請參閱第 5.1.8.1 節(jié),“系統(tǒng)變量特權(quán)”。更改設(shè)置會影響新操作的緩沖,但不會影響現(xiàn)有緩沖條目的合并。
配置最大變更緩沖區(qū)的大小
innodb_change_buffer_max_size
參數(shù)允許按照緩沖池總大小的百分比配置變更緩沖區(qū)的最大大小。默認(rèn)情況下,innodb_change_buffer_max_size
設(shè)置為 25。最大設(shè)置值為 50。
在 MySQL 服務(wù)器上,如果存在大量的插入、更新和刪除活動,并且變更緩沖區(qū)合并無法跟上新的變更緩沖條目的速度,導(dǎo)致變更緩沖區(qū)達(dá)到了其最大大小限制,那么可以考慮增加innodb_change_buffer_max_size
。
在 MySQL 服務(wù)器上,如果數(shù)據(jù)是用于報告目的而基本靜態(tài),或者如果變更緩沖區(qū)占用了與緩沖池共享的太多內(nèi)存空間,導(dǎo)致頁面過早地從緩沖池中淘汰,那么可以考慮減小innodb_change_buffer_max_size
的值。
為了確定最佳配置,您可以使用一個代表性的工作負(fù)載來測試不同的設(shè)置。innodb_change_buffer_max_size
參數(shù)是動態(tài)的,這意味著您可以在不重新啟動服務(wù)器的情況下修改該設(shè)置。
監(jiān)控變更緩沖區(qū)
以下選項可用于監(jiān)控變更緩沖區(qū):
-
InnoDB
標(biāo)準(zhǔn)監(jiān)視器輸出包括變更緩沖區(qū)的狀態(tài)信息。要查看監(jiān)視器數(shù)據(jù),請執(zhí)行SHOW ENGINE INNODB STATUS
語句。mysql> SHOW ENGINE INNODB STATUS\G
變更緩沖區(qū)狀態(tài)信息位于
INSERT BUFFER AND ADAPTIVE HASH INDEX
標(biāo)題下方,并且顯示類似以下內(nèi)容:------------------------------------- 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
有關(guān)更多信息,請參閱第 14.18.3 節(jié) “InnoDB 標(biāo)準(zhǔn)監(jiān)視器和鎖監(jiān)視器輸出”。
-
Information Schema
的INNODB_METRICS
表提供了InnoDB
標(biāo)準(zhǔn)監(jiān)視器輸出中的大部分?jǐn)?shù)據(jù)點以及其他數(shù)據(jù)點。要查看變更緩沖區(qū)指標(biāo)及其描述,請執(zhí)行以下查詢:mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G
有關(guān)`INNODB_METRICS表用法情況的信息,請參見第 14.16.6 節(jié)“ InnoDB INFORMATION_SCHEMA Metrics Table”。
-
Information Schema
的INNODB_BUFFER_PAGE
表提供了關(guān)于緩沖池中每個頁面的元數(shù)據(jù),包括變更緩沖區(qū)索引和變更緩沖區(qū)位圖頁面。變更緩沖區(qū)頁面通過PAGE_TYPE
進(jìn)行標(biāo)識。IBUF_INDEX
是變更緩沖區(qū)索引頁的頁面類型,IBUF_BITMAP
是變更緩沖區(qū)位圖頁的頁面類型。Waring:查詢
INNODB_BUFFER_PAGE
表可能會帶來顯著的性能開銷。為了避免影響性能,建議在測試實例上重現(xiàn)您要調(diào)查的問題,然后在測試實例上運行查詢。例如,您可以查詢
INNODB_BUFFER_PAGE
表,以確定IBUF_INDEX
和IBUF_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 | +---------------------+-------------+-------------------------------+
有關(guān)
INNODB_BUFFER_PAGE
表提供的其他數(shù)據(jù)的信息,請參閱第 24.4.2 節(jié) “INFORMATION_SCHEMA INNODB_BUFFER_PAGE Table”。有關(guān)相關(guān)使用信息,請參閱第 14.16.5 節(jié) “InnoDB INFORMATION_SCHEMA緩沖池表”。 -
Performance Schema
為高級性能監(jiān)控提供了變更緩沖區(qū)互斥鎖等待檢測。要查看變更緩沖區(qū)檢測,請執(zhí)行以下查詢: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 | +-------------------------------------------------------+---------+-------+
有關(guān)監(jiān)視
InnoDB
互斥鎖等待的信息,請參閱第 14.17.2 節(jié) “使用 Performance Schema 監(jiān)視 InnoDB 互斥等待”。文章來源:http://www.zghlxwxcb.cn/news/detail-499190.html
注:原文來自 MySQL 5.7 官方文檔,閱讀 MySQL 中文文檔時有些語句理解不順暢,便結(jié)合中文文檔使用 ChatGPT 進(jìn)行了翻譯,如有不正請指出。文章來源地址http://www.zghlxwxcb.cn/news/detail-499190.html
到了這里,關(guān)于MySQL 存儲引擎 InnoDB 內(nèi)存結(jié)構(gòu)之更改緩沖區(qū)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!