Change Buffer使用场景

发布时间 2023-09-29 17:32:13作者: kiper

涉及场景

仅针对非唯一的普通索引,有性能优化效果

例子

如果一个表上有字段 a, b, 且有普通索引c。

update语句为 update xxx set a = 'xxx' where c = 'xxx', 执行这个语句的时候, 因为要判断c = 'xxx' 的记录是否存在, 存在的话才会更新, 此时必定要将c 索引的内存页载入到内存中(执行计划会走索引c) , 修改内存页,写redo log; 同时主键索引页也要载入内存进行修改(主键索引永远都需要先读后写,这个免不了)。这个就用不到Change Buffer。

但是如果是另外一种场景: update xxx set a = 'xxx' where b = 'xxx' , 这个时候因为查询条件不走索引c,故不需要将c的数据页载入内存, 针对索引c上的修改就写入到Change Buffer, 但是针对主键索引,还是要先载入内存再修改。 此时的优化就是针对索引c的页的随机io的优化。

如果还有普通索引d/e/f等,都是同样的WAL写入change buffer,不用在更新的时候立即去随机IO更新对应的索引树。