[mysql]change buffer 和 redo log 的区别

215 阅读1分钟

image.png

首先执行

insert into t(id, k) values(id1, k1), (id2, k2);

向表中插入两行数据(id1, k1), (id2, k2)

假设当前状态为, k1 在 buffer pool 中, k2 不在内存中。

图中一共涉及四个部分: 1, buffer pool:包含 change buffer 和 page, buffer pool 是内存的数据结构,可以简单地理解为内存 2, system table space: change buffer 持久化在磁盘上的空间 3, redo log:记账板,相当于写到数据库中了。只不过这个需要在后台刷到数据库中,触发条件? 4, t.ibd :数据表空间

change buffer 的作用: 如果数据不在内存中,在更新数据的时候,直接将更新日志记录在 change buffer 中(虽然名字叫 buffer,但是可以持久化到磁盘中的,它在磁盘和内存中都有拷贝),等下一次读该数据的时候再从磁盘中读取数据所在的页到内存中,并且根据change buffer 的日志 merge成正确的数据并返回。

这时候会做以下操作: 1, k1 直接更新内存 2, k2 会记录到 change buffer 中,“我要往page2中插入一行” 3, redo log 记录上述两个动作

在这种状态的时候,发生读操作

select * from t where k in(k1, k2);

1,读page1的时候,直接返回 2,读page2的时候,需要把page2从磁盘读入到内存里,然后根据change buffer 中的日志,merge成正确的结果,并返回。

因此,redo log,减少随机写(将随机写延迟,放到一起,变成顺序写),change buffer 减少随机读。