Change Buffer功能html
當執行INSERT/DELETE/UPDATE三類DML操做須要修改二級索引上數據時,若是須要修改的二級索引頁未存在於當前Buffer Pool中,能夠先將該"修改操做"進行緩存,等待其餘操做加載二級索引頁時,再將「修改操做」合併到二級索引頁中,以減小二級索引修改產生的隨機IO,縮短INSERT/DELETE/UPDATE三類DML操做的響應時間。mysql
Change Buffer歷史sql
在MySQL 5.5以前版本中,僅支持INSERT 操做,所以被稱爲INSERT BUFFER,在MySQL 5.5以後版本中,支持INSERT/DELETE/CHANGE/PURGE等操做,所以被稱爲Change Buffer。數據庫
Change Buffer實現方式緩存
一、經過bitmap數據結構中IBUF_BITMAP_FREE來標識每一個數據頁剩餘空間範圍(2bit,標識空閒空間範圍0bytes/512bytes/1024bytes/2018bytes), 若是修改操做須要的空間超過2K,則不會進行緩存。數據結構
二、經過bitmap數據結構中IBUF_BITMAP_BUFFERED來標記數據頁是否有緩存app
三、經過bitmap數據結構中IBUF_BITMAP_IBUF來標記數據頁是不是Change Buffer Tree的一部分,用於異步AIO讀操做。異步
四、經過一顆B樹來緩存二級索引的修改操做,樹中每條記錄經過space_id+page_no來肯定數據頁,在經過遞增counter來標記修改順序,其餘列存放修改操做的相關數據。學習
Change Buffer操做類型spa
Change Buffer緩存三種操做:INSERT/DELETE-MARK/DELETE,
因爲UPDATE操做等價於DELETE+INSERT操做,而DELETE操做在MySQL數據庫中會先將記錄標記爲DELETE再後期進行PURGE操做,所以DML操做對應INSERT/DELETE-MARK兩種操做,而MySQL系統進程PURGE對應DELETE操做。
能夠經過參數innodb_change_buffering來控制CHANGE BUFFER緩存操做:
參數innodb_change_buffering解釋 Whether InnoDB performs change buffering, an optimization that delays write operations to secondary indexes so that the I/O operations can be performed sequentially. Permitted values are described in the following table. Values may also be specified numerically. Permitted Values for innodb_change_buffering Value Numeric Value Description none 0 Do not buffer any operations. inserts 1 Buffer insert operations. deletes 2 Buffer delete marking operations; strictly speaking, the writes that mark index records for later deletion during a purge operation. changes 3 Buffer inserts and delete-marking operations. purges 4 Buffer the physical deletion operations that happen in the background. all 5 The default. Buffer inserts, delete-marking operations, and purges. https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_change_buffering
能夠經過參數innodb_change_buffer_max_size來控制change buffer使用InnoDB buffer pool的比例,默認爲25%,最大爲50%
Change Buffer操做限制
一、Change Buffer僅緩存二級索引的葉子節點,非葉子節點沒法緩存。
二、Change Buffer僅能緩存二級惟一索引的DELETE操做,沒法緩存INSERT操做,由於須要確保索引記錄惟一性。
三、當表正在執行FLUSH TABLE時,沒法對該表操做進行緩存。
四、若是表主鍵是降序索引或者二級索引中使用降序列,則沒法使用緩存。
學習資料: