MySQL:change buffer

1. 概念

  Innodb维护了一个缓存区域叫作Buffer Pool,用来缓存数据和索引在内存中。其大小经过参数 innodb_buffer_pool_size 控制;数据库

  change buffer 是 buffer pool 中的一部份内存;它既在内存中有拷贝,也能够持久化到磁盘;其大小经过参数 innodb_change_buffer_max_size 控制,表示最多占用 buffer pool的百分比;缓存

  当须要更新一个数据页时,若是数据页在内存中,则直接更新;不然,在不影响数据一致性的前提下,InnoDB 将这些操做缓存在 change buffer 中,这样就没必要从磁盘中读取数据,当下次查询须要访问这个数据页时,再将数据页读入内存,而后执行 change  buffer 中与这个页有关的操做,最后将查询结果返回。spa

  merge:将  change  buffer 的操做应用到数据页的过程称为 merge。除了访问数据页会触发 merge 外;系统后台有线程会按期 merge;数据库正常关闭的过程当中也会触发 merge 操做。线程

  更新操做记录到 change  buffer ,能够减小读磁盘,提升执行效率;并且读入数据会占用 buffer pool ,还能够提升内存使用率。日志

2. 使用条件

  对于惟一索引,全部更新操做都须要作惟一性约束的判断,必须将数据页读入内存,直接在内存中更新,不使用 change  buffer 。索引

  对于普通索引,当数据页在内存中时,直接进行更新操做便可;当数据页不在内存中时,直接将更新操做写入 change buffer 便可。内存

3. 使用场景

  change buffer 的主要做用就是将记录的变动操做缓存下来,在 merge 以前, change buffer 记录的越多,收益就越大。innodb

  适合页面变动完以后被立刻访问几率较小的场景。效率

  若是页面变动以后又要被访问,此时会当即触发 merge 过程,这样反而增长了 change buffer 的维护代价,多了一个写 change buffer 的操做,此时关闭 change buffer 反而能提升效率;后台

4. changer buffer 和 redo log

  change buffer 主要节省的是随机读磁盘的IO 消耗;

  redo log 主要是节省随机写磁盘的IO消耗;

  更新普通索引时:

    若是数据不在内存中,能够直接将变动操做缓存到 change buffer,而不须要将数据读入内存;若是没有 change buffer,则必须将数据读入内存,而后更新数据。此时节省了随机读磁盘的IO消耗;

    redo log 将数据变动操做记录在日志中,不用写入磁盘便可返回执行结果;若是没有 redo log,则更新完数据必须先将数据写入磁盘,再返回执行结果。此时节省了随机写磁盘的IO消耗;

  查询普通索引时:

    若是数据不在内存中,必须先将数据读入磁盘,再执行 change buffer 中的相关操做,而后返回查询结果。只有查询数据时,才须要将数据读磁盘到内存

相关文章
相关标签/搜索