Skip to the content.

有了 Buffer Pool来缓存了页,数据库要读一个页,先到 Buffer Pool 找,要是没找到就到磁盘上去取,读操作不更新实际的页,所以只能老老实实到磁盘上去找了。那么对于 insert、update 或者 delete 操作,同样先到 buffer pool 里查看一番,没有就到磁盘里找,这里有没有能够优化的地方?

有,一般表更新完成之后,需要同时进行表上索引的更新,这两个操作类似于事务,必须都完成才行。 表上的更新用的 buffer pool缓存,如果没有就到磁盘上的 B+tree上更新。对于索引,就没有表更新那么幸运,随机IO会更多,特别针对insert操作来说。所以InnoDB 就搞了一块缓存空间来优化这部分操作,那就是 change buffer了。

其实最早的时候只有 insert buffer,只对插入操作进行缓存,我觉得很可能是因为 update 操作需要先删除再插入,delete操作也不是那么普遍,所以总体来说大部分还是在做 insert的操作,优化insert操作就差不多啦。那么,change buffer 可以缓存哪些操作,通过 innodb_change_buffering的取值就知道啦:

有以下几个注意点:

使用了 change buffer 后 插入操作的过程:

涉及的参数就两个:

change buffer 不适用的场景:

参考链接: