理解change buffer(insert buffer)


Change Buffer的作用:

  • 作用於不在緩存池中的非唯一索引頁
  • 對該頁進行寫操作后並不會立刻將該頁從磁盤中加載到緩存池,而是在change buffer中記錄頁的修改,等該頁被讀取時,再將修改的數據merger到緩存池中;
  • 以此來緩解寫操作多次隨機讀的IO消耗;
  • 當索引中包含降序索引或者主鍵中包含降序索引時不會用到change buffer;
  • 當change buffer大小超過最大閾值后不會再使用change buffer;

merge策略:

  • 被動merge:當用戶線程主動發起change buffer中索引頁的讀取操作時,會被動的將頁的修改記錄merge到原始索引頁中;
  • 主要merge:master thread定期將change buffer中的記錄隨機刷回索引頁,如果每秒master thread有空閑I/O能力,則刷5個緩存索引頁,每10秒不管I/O壓力都會刷5個緩存的索引頁記錄;

相關參數:

innodb_change_buffer_max_size = 25 #默認25表示change buffer最大可以占用innodb buffer的25%,最大可設置的值為50
innodb_change_buffering = all #默認all表示所有的非唯一普通索引頁寫入都使用change buffer
    all
    none #關閉change buffer
    inserts #緩沖插入操作
    deletes #緩沖刪除操作
    changes #緩沖插入和刪除操作
    purges #緩沖在后台發生的物理刪除操作

相關監控信息:

show engine innodb status\G
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 3077, seg size 3079, 3338271 merges
merged operations:
 insert 3679942, delete mark 333798, delete 1737
discarded operations:
 insert 0, delete mark 0, delete 0
    #size 1 正在使用的page
    #free list len 3077 空閑的page
    #seg size 3079 當前change buffer大小3079*16K
    #3338271 merges 合並的數目
    #insert 3679942 通過change buffer插入的數目
    #delete mark 333798 通過change buffer刪除的數目
    #delete 1737 通過change buffer purge的數目
    #change buffer的效果=merges/(insert+delete mark+delete)結果越小說明change buffer對性能提升越有利

mysql> select NAME,COUNT,MAX_COUNT,MIN_COUNT,AVG_COUNT,COMMENT from information_schema.innodb_metrics where name like '%ibuf%';
+-----------------------------------------+---------+-----------+-----------+--------------------------+-------------------------------------------------------------+
| NAME                                    | COUNT   | MAX_COUNT | MIN_COUNT | AVG_COUNT                | COMMENT                                                     |
+-----------------------------------------+---------+-----------+-----------+--------------------------+-------------------------------------------------------------+
| buffer_page_read_index_ibuf_leaf        |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Index Leaf Pages read               |
| buffer_page_read_index_ibuf_non_leaf    |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Index Non-Leaf Pages read           |
| buffer_page_read_ibuf_free_list         |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Free List Pages read                |
| buffer_page_read_ibuf_bitmap            |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Bitmap Pages read                   |
| buffer_page_written_index_ibuf_leaf     |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Index Leaf Pages written            |
| buffer_page_written_index_ibuf_non_leaf |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Index Non-Leaf Pages written        |
| buffer_page_written_ibuf_free_list      |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Free List Pages written             |
| buffer_page_written_ibuf_bitmap         |       0 |      NULL |      NULL |                     NULL | Number of Insert Buffer Bitmap Pages written                |
| ibuf_merges_insert                      | 3681684 |   3681684 |      NULL |       0.9494142111810469 | Number of inserted records merged by change buffering       |
| ibuf_merges_delete_mark                 |  333962 |    333962 |      NULL |      0.08612044618561636 | Number of deleted records merged by change buffering        |
| ibuf_merges_delete                      |    1740 |      1740 |      NULL |    0.0004487024762187688 | Number of purge records merged by change buffering          |
| ibuf_merges_discard_insert              |       0 |         0 |      NULL |                        0 | Number of insert merged operations discarded                |
| ibuf_merges_discard_delete_mark         |       0 |         0 |      NULL |                        0 | Number of deleted merged operations discarded               |
| ibuf_merges_discard_delete              |       0 |         0 |      NULL |                        0 | Number of purge merged  operations discarded                |
| ibuf_merges                             | 3340164 |   3340164 |      NULL |       0.8613447458487284 | Number of change buffer merges                              |
| ibuf_size                               |       1 |       699 |      NULL | 0.0000002578749863326257 | Change buffer size in pages                                 |
| innodb_ibuf_merge_usec                  |       0 |      NULL |      NULL |                     NULL | Time (in microseconds) spent to process change buffer merge |
+-----------------------------------------+---------+-----------+-----------+--------------------------+-------------------------------------------------------------+

change buffer局限:

  • 需要作用於非唯一索引,因為非唯一索引不要校驗數據重復;
  • change buffer會占用一定的innodb buffer空間;  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM