理解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空间;  

 

posted @ 2021-01-29 17:33  小有志气  阅读(919)  评论(0编辑  收藏  举报