【MySQL(四)】change buffer机制

change buffer是针对数据库的更新语句做的一种优化。之前介绍过,wal机制是一种更新语句的优化,可以将磁盘随机写转变为磁盘顺序写。那么change buffer 又是如何优化的呢?

个人理解:wal是使用了redo log,在磁盘级别缓存了更新操作,磁盘随机写->磁盘顺序写;change buffer是使用了内存buffer,在内存级别又缓存了一次更新操作,降低了磁盘随机读的次数。

详细看下:

对于一次更新操作,innodb引擎会看更新的页是否在buffer pool中,如果在,那么直接更新buffer pool,并且写入一条redo log。这样后续的读取操作可以读到最新的值。如果不在,那么就先将本次更新操作记录到change buffer中,而不是立刻取更新,最后再记录一条redo log。如果后面有读操作,那么再将对应的数据页载入到buffer pool中,同时将change pool中的更新操作应用到该数据页,这个过程叫做merge。当然如果系统是空闲状态,也会有后台线程去做merge过程。

可以看到,innodb对于更新操作的优化原则就是使用缓存手段,尽量延后更新操作。当然这个思路仅适用于写多读少的场景,比如日志系统。因为如果写完数据后立刻要读,那么没有必要额外维护change buffer的缓存了。

还有一点,change buffer仅用于更新普通索引,对唯一性索引无效,因为唯一性索引肯定要读数据页做唯一性判断的。

相关参数:

innodb_change_buffer_max_size:changebuffer缓存占整个缓存的比例;

innodb_change_buffering:哪些更新操作可以使用changebuffer;

参考:https://juejin.im/post/5d1357b8f265da1b961314c0

小结:

1、wal,优化磁盘写性能;

2、change buffer,减少磁盘读次数;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章