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