本篇文章介绍同在内存结构中的另一个缓冲池“change buffer”和“log buffer”
“change buffer”在innodb的1.0版本之前叫“insert buffer”主要用于辅助索引(二级索引,非聚簇索引)的dml操作。
什么是“聚簇索引”和“辅助索引”,聚簇索引就是选择主键建立的索引如果没有选择主键就会选择唯一索引,没有唯一索引就会自动建立一个隐藏的rowid作为聚簇索引。聚簇索引存放的数据一般都是顺序且唯一,并且在叶子节点会存放该索引一整行的数据,读取聚簇索引的数据一般不会产生磁盘的随机读写速度较快。而辅助索引的列一般非唯一且重复操作辅助索引的数据会造成大量的磁盘随机读写影响效率。
综上所述为此引入了“change buffer”的功能来改善这一情况,之所以改名是因为在1.0版本后Insert、Delete、Update。都进行了缓冲。
而change buffer的作用就是,在执行插入操作时先去缓冲池查找看辅助索引的也在不在缓冲池,如果在就直接插入。不在就放到change buffer中,按照设定的时间规律集中的merge操作。因为此时常常会是多个插入操作同时merge,所以会提高辅助索引的插入性能。merge的操作通常在三种情况下会执行;
一:有个专门的后台线程监控系统的资源使用情况在系统比较空闲时merge ;
二:缓冲池的空间不够时;
三:数据库正常关闭时;
四:redo log写满时;
相关的参数:
innodb_change_buffer_max_size
允许将更改缓冲区的最大大小配置为缓冲池总大小的百分比。默认25%最大50%。
最后简单的说一下log buffer,日志缓冲区就是存储要写入到redo log(磁盘上的文件)的内存区域。它的内容会定期的刷新到磁盘。如果业务上有大量dml相关的事务,增加此缓存大小可以减少磁盘io。
相关参数如下:
innodb_flush_log_at_trx_commit
控制日志缓冲区的内容如何写入和刷新到磁盘。该innodb_flush_log_at_timeout
变量控制日志刷新频率。