ITPub博客

首页 > 数据库 > MySQL > mysql change buffer小结

mysql change buffer小结

原创 MySQL 作者:贺子_DBA时代 时间:2020-06-20 14:08:59 0 删除 编辑

首先:正常insert的时候,也是首先要判断哪个物理页(包括数据页和索引页)可以insert,然后把这个物理块读取到buffer pool,然后再在内存执行insert 操作,然后再刷新到磁盘;

接下来介绍下我对change buffer的认识,知识来自于网络文章+innodb 存储引擎书籍+官方文档

0)Change Buffer为何提高性能

它缓存的是一个索引页的 dml的操作,而不是具体的数据页,具体的数据页直接就修改了,对非聚集非唯一的索引页修改的时候才可能用到change buffer。当 buffer pool中没有某个索引页,并且需要dml操作这个索引页的数据的时候,不需要先从磁盘读取该索引页到buffer pool,直接把该操作记录到cahnge buffer 中,这里就减少了一次随机io,然后等下次业务需要访问这个索引页的时候,再把这个页读取到buffer poo中,然后change buffer记录的操作和buffer pool中刚读进来的索引页进行merge 操作。

提高性能的地方还有一点是:对于非聚集非唯一索引的更新或者插入操作,不是每次插入或者更新操作完, 都直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,不在则放到change buffer中,然后以一定的频率和情况进行change buffer和辅助索引叶子的merge(合并)操作,这时通常可以将多个索引叶子的dml操作合并到一个操作里(因为在一个索引页中),这里也提高了性能

综上所述 cahnge buffer 性能的提升在于两点:

一:当需要修改的索引页不在buffer pool的时候,不需要先把索引页读取到buffer pool,这里减少了io

二:将多个索引叶子的dml操作合并到一个操作里(因为在一个索引页中),批量merge,这里也提高了性能;

1)change buffer的内容

Change Buffer是一种特殊的数据结构,缓存对二级索引页面的更改并且这些页面不在Buffer Pool中(注意缓存的是对索引叶子的修改,而不是具体的索引叶子)。缓存的changes可能由 Insert 、Delete 和 Update的结果导致。稍后在页面被其他读取操作加载到Buffer Pool的时候合并,

简而言之:Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。

3)change buffer 只针对辅助索引而言

对主键索引无效;对辅助索引叶子节点的更改才可能借助change buffer ,如果该列上没有索引,那么就不会借助change buffer了!

4)缓冲池有change buffer 信息固然不错,但他不是单纯是缓存池的一部分,change buffer 和数据页一样,change buffer 是一个B+树,放在共享表空间,默认也就是idbata1,向change buffer 写数据也是需要随机io,但有change buffer后,当buffer 中没有需要修改的叶子块的时候,你不需要把叶子块读进innodb_buffer_cahce中(减少的就是这里的io)只需要把改变写进cahnge buffer即可,然后cahnge buffer中排序最后等待和真正的叶子节点数据合并!批量合并!所以如果更新操作不频繁的时候,并且更新后立马需要读取该页的时候,change buffer 的机制会增加部分io消耗! change buffer 减少了从内存读取硬盘的随机读IO(数据页)操作,换做成批量顺序merge,redo log减少了随机写log操作

5).之所以需要满足索引是辅助索引,并且是非唯一的

因为在插入缓冲时,数据库并不去查找索引页来判断插入的记录的唯一性,如果去查找肯定又会有离散读取的情况发生(随机io),从而导致change buffer 失去意义!

6) change buffer的相关参数

1 innodb_change_buffering 默认是all支持所有DML操作

2 innodb_change_buffer_max_size,默认是25,即缓冲池的1/4。最大可设置为50,采用默认即可

7).合并的操作是在 buffer pool里面进行的

当下一次需要加载这个页面的时候,也就是这个页面有需求的时候,会将Change Buffer内的更改合并到Buffer Pool,随后当服务器在空闲的时候,这个更改会刷到disk(磁盘)上, 或者在不繁忙的时候进行merge,这时候merger操作也是发生在buffer pool;

8).为什么change buffer 存的是 buffer pool中没有的索引页的操作?

因为如果在buffer pool中,那么就直接dml操作对应的索引页了,change buffer 存在就是为了当需要操作的索引页不在buffer pool中,然后不需要立马去磁盘读取该索引页,只有当buffer pool中不存在的时候才可能用到change buffer;

9) 除了数据页被访问,还有哪些场景会触发刷写缓冲中的数据呢?

还有这么几种情况,会刷写缓冲中的数据:

(1)有一个后台线程,会认为数据库空闲时;

(2)数据库缓冲池不够用时;

(3)数据库正常关闭时;

(4)redo log写满时;

画外音:几乎不会出现redo log写满,此时整个数据库处于无法写入的不可用状态。

10)什么业务场景,适合开启InnoDB的写缓冲机制?

先说什么时候不适合,如上文分析,当:

(1)数据库都是唯一索引;

(2)或者,写入一个数据后,会立刻读取它;

这两类场景,在写操作进行时(进行后),本来就要进行进行页读取,本来相应页面就要入缓冲池,此时写缓存反倒成了负担,增加了复杂度。

什么时候适合使用写缓冲,如果:

(1)数据库大部分是非唯一索引;

(2)业务是写多读少,或者不是写后立刻读取;

可以使用写缓冲,将原本每次写入都需要进行磁盘IO的SQL,优化定期批量写磁盘。

画外音:例如,账单流水业务。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29654823/viewspace-2699606/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
记录工作中遇到的问题,积少成多,坚持就是胜利,工作经历:曾就职于国美、中国采购与招标网、目前就职于一家正规消费金融公司

注册时间:2014-05-12

  • 博文量
    259
  • 访问量
    1824824