MySQL的change buffer是啥?|Java 开发实战

本文正在参加「Java主题月 - Java 开发实战」,详情查看 活动连接数据库

基本概念

change buffer是一种特殊的数据结构,当这些页面不在缓冲池中时,这些高速缓存会将更改缓存到辅助索引页面。可能由INSERT,UPDATE或DELETE操做(DML)致使的缓冲更改将在之后经过其余的读取操做将页加载到缓冲池中时合并。 缓存

如上图可见,change buffer用的是buffer pool里的内存,因此不能无限增加。change buffer大小可经过参数innodb_change_buffer_max_size动态设置。 好比设置为50:change buffer的大小最多只能占用buffer pool的50%。markdown

需更新一个数据页时:数据结构

  • 页在内存,直接更新
  • 页不在内存,在不影响数据一致性下,InooDB会将这些更新操做缓存于change buffer,而无需从磁盘读入页

在下次查询访问该数据页时,才将数据页读入内存,而后执行change buffer中与这个页有关的操做。经过该方式就能保证该数据逻辑的正确性。post

change buffer 实际上也是可持久化的数据,即它不只在内存中有拷贝,也会被写进磁盘。spa

merge

将change buffer中的操做应用到原数据页,获得最新结果的过程。线程

触发时机

  1. 访问该数据页
  2. 系统后台线程按期merge
  3. 数据库正常关闭(shutdown)的过程

若能将更新操做先记录在change buffer,减小读盘,语句执行速度便会明显提高。且数据读入内存须要占用buffer pool,所以也能下降内存占用,提升内存利用率。日志

什么时候使用change buffer

  • 对于惟一索引,更新操做都要先判断该操做是否违反惟一性约束:

好比,要插入(4,400)记录,要先判断表中是否已存k=4记录,就必需要将数据页读入内存来判断。若都已读入内存了,那直接更新内存天然很快,不必使用change buffer。 所以,惟一索引的更新不能使用change buffer,只有普通索引可以使用code

适用场景

难道普通索引的全部场景,使用change buffer均可加速吗?orm

注意merge才是真正进行数据更新时刻,change buffer主要是将记录的变动动做缓存。因此在一个数据页作merge前,change buffer记录变动越多(即该数据页上要更新的次数越多),收益越大。

  • 写多读少业务,页面在写完后立刻被访问到的几率较小,change buffer使用效果最好。常见为帐单、日志类系统。
  • 写后立刻查询,将先新记录在change buffer,但以后因为当即访问该数据页,又很快触发merge,这样的话随机访问IO次数不会减小,反而增长change buffer维护代价,change buffer起了反作用。
相关文章
相关标签/搜索