change buffer不仅不能给普通索引加速,还起到反作用的呢?

有没有哪些场景下,change buffer不仅不能给普通索引加速,还起到反作用的呢?

当需要更新一个数据页时,如果数据页在内存(buffer pool)中就直接更新好了(还要记下redo log),

但是 如果这个数据页还没有在内存中,并且不是唯一索引不用查是不是重了, InooDB 会将这些更新操作缓存在 change buffer 中(同样要记下redo log),

这样就不需要 从磁盘中 读入这个数据页了来更新了

好处:

语句的执行速度会得到明显的提升。

数据读入内存是需要占用 buffer pool 的,还能够避免占用内存,提高内存利用率。

虽然名字叫作 change buffer,实际上它是可以持久化的数据。也就是说,change buffer 在内存中有拷贝,也会被写入到磁盘上。

将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge。

时机是:

访问这个数据页会触发 merge

系统有后台线程会定期 merge。

在数据库正常关闭(shutdown)的过程中,会执行 merge 操作。

使用场景

change buffer 只限于用在普通索引的场景下,而不适用于唯一索引。

对唯一索引, 必须先查询看有没有已经存在, 才能改, 所以必须先把数据从磁盘读入内存, 这步不能省

那么,现在有一个问题就是:普通索引的所有场景,使用 change buffer 都可以起到加速作用吗?

merge 的时候是真正进行数据更新的时刻,而 change buffer 的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做 merge 之前,change buffer 记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。

因此,对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。

常见的就是 账单类、日志类的系统。

反过来,写入之后马上会做查询,那么即使满足了条件,将更新先记录在 change buffer,立即触发 merge 过程。

随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价。

相关推荐
rgeshfgreh11 分钟前
Python连接KingbaseES数据库全指南
开发语言·数据库·python
小北方城市网15 分钟前
数据库性能优化实战指南:从索引到架构,根治性能瓶颈
数据结构·数据库·人工智能·性能优化·架构·哈希算法·散列表
TDengine (老段)17 分钟前
TDengine Go 语言连接器进阶指南
大数据·数据库·物联网·golang·时序数据库·tdengine·涛思数据
何中应20 分钟前
使用Spring自带的缓存注解维护数据一致性
java·数据库·spring boot·后端·spring·缓存
ZeroToOneDev20 分钟前
Mybatis
java·数据库·mybatis
野犬寒鸦26 分钟前
从零起步学习RabbitMQ || 第一章:认识消息队列及项目实战中的技术选型
java·数据库·后端
枫叶丹428 分钟前
【Qt开发】Qt系统(六)-> Qt 线程安全
c语言·开发语言·数据库·c++·qt·安全
HalvmånEver34 分钟前
Linux:深入剖析 System V IPC上(进程间通信八)
linux·运维·数据库·c++·system v·管道pipe
brevity_souls41 分钟前
SQL 中“过滤条件”写在 SELECT、JOIN 和 WHERE 的区别
数据库·sql
麦聪聊数据1 小时前
拒绝循环写库:MySQL 批量插入、Upsert 与跨表更新的高效写法
数据库·sql·mysql