行业动态

防御吧作为15年知名老牌域名服务商,CNNIC和CANN双认证域名注册商,已经
持续为500多万个域名提供服务,包括智能DNS/自由转移/隐私保护等服务!
MySQL数据库的提速器-写缓存(Change Buffer)
2020-02-27 15:29:37 【

写缓存(Change Buffer)是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在buffer pool中的话,在不影响数据一致性的前提下,InnoDB引擎会将对数据的操作缓存在Change Buffer中,这样就省去了从磁盘中读入这个数据页。


将数据页从磁盘读入内存中涉及随机IO访问,这也是数据库里面成本最高的操作之一,而利用写缓存(Change Buffer)可以减少IO操作,从而提升数据库性能。


关于MySQL写缓存(Change Buffer),我们先来看看InnoDB的技术架构图:




Change Buffer是Buffer Pool中的一部分,虽然Change Buffer名字叫Buffer,但是它也是可以持久化的,在右边的System Tablespace中可以看到持久化Change Buffer的空间。触发写缓存(Change Buffer)持久化操作有以下几种情况:


1、数据库空闲时,后台有线程定时持久化

2、数据库缓冲池不够用时

3、数据库正常关闭时

4、redo log 写满时


再单独看看Change Buffer的架构图,如下所示:




图中详细的描述了Change Buffer的功能,Change Buffer中的数据最终还是会刷回到数据所在的原始数据页中,Change Buffer数据应用到原始数据页,得到新的数据页的过程称之为merge。merge过程中只会将Change Buffer中与原始数据页有关的数据应用到原始数据页,以下三种情况会发生merge操作:


1、原始数据页加载到 Buffer Pool 时。

2、系统后台定时触发 merge 操作。

3、MySQL 数据库正常关闭时。


Change Buffer的相关设置


上面就是写缓存(Change Buffer)的相关知识,写缓存(Change Buffer)我们也是可以使用命令参数来控制,MySQL数据库提供了两个对写缓存(Change Buffer)的参数。




1、innodb_change_buffer_max_size


innodb_change_buffer_max_size表示Change Buffer最大大小占Buffer Pool的百分比,默认为25%。最大可以设置为50%。


2、innodb_change_buffering


innodb_change_buffering参数用来控制对哪些操作启用Change Buffer功能,默认是:all。innodb_change_buffering参数有以下几种选择:


--all:      默认值。开启buffer inserts、delete-marking operations、purges

--none: 不开启change buffer

--inserts:  只是开启buffer insert操作

--deletes:  只是开delete-marking操作

--changes:  开启buffer insert操作和delete-marking操作

--purges:   对只是在后台执行的物理删除操作开启buffer功能


对上面写缓存(Change Buffer)如果你还是云里雾里的话,那么我们就用一个案例来说明一下Change Buffer,首先我们向数据库中插入两条数据:


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


结合下面这张图来分析这两条插入语句。




假设当前是K索引树的状态,K1所在的数据页page1在Buffer Pool中,k2所在的数据页不在Buffer Pool中,来看看这两条语句的执行流程:


1、对于k1这条数据,Page 1在内存中,所以直接更新内存,不会使用到Change Buffer;


2、k2对应的数据页Page 2 没有在内存中,就在内存的change buffer区域,记录下“我要往Page 2 插入一行”这个信息,这个地方及其关键,并没有从磁盘中将page2加载到内存。


3、将上述两个动作记入redo log中(图中 3 和 4)。


4、后台线程会定时将page1和Change Buffer中的数据持久化


主要地方在于步骤二,这就是写缓存(Change Buffer)提高性能的地方,虽然page2 并没有在内存中,但是并没有妨碍我们往数据库page2中插入数据,这就是写缓存(Change Buffer)的巧妙之处,也是写缓存(Change Buffer)提高MySQL的地方。


Change Buffer适用场景


Change Buffer并不是适用于所有场景,以下两种情况不适合开启Change Buffer :


1、数据库都是唯一索引

如果数据库都是唯一索引,那么在每次操作的时候都需要判断索引是否有冲突,势必要将数据加载到缓存中对比,因此也用不到 Change Buffer。


2、写入一个数据后,会立刻读取它

写入一个数据后,会立刻读取它,那么即使满足了条件,将更新先记录在 change buffer,但之后由于马上要访问这个数据页,会立即触发 merge 过程。这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价。所以,对于这种业务模式来说,change buffer 反而起到了副作用。


以下几种情况开启Change Buffer,会使得MySQL数据库明显提升:


1、数据库大部分是非唯一索引

2、业务是写多读少

3、写入数据之后并不会立即读取它


总体来说 InnoDB 的写缓存(Change Buffer)应用得当,会极大提高 MySQL 数据库的性能,使用不恰当的话,可能会适得其反。


以上就是今天分享的内容,希望对您的学习或者工作有所帮助,如果您觉得文章不错,欢迎点个赞和转发,谢谢。

————————————————

版权声明:本文为CSDN博主「平头哥的技术博文」的原创文章

原文链接:https://blog.csdn.net/z694644032/article/details/104532860


】【打印关闭】 【返回顶部
分享到QQ空间
分享到: 
上一篇教育云服务器解决方案 下一篇DDoS攻击现状以及如何防御DDoS攻击

立足首都,辐射全球,完美防御专注云防御及云计算服务15年!

联系我们

服务热线:010-56157787 ,010-56159998
企业QQ:4000043998
技术支持:010-56159998
Copyright ? 2003-2016 gnmianbeian.com. 免备案服务器网版权所有 增值许可:京B2-20140042号
售前咨询
公司总机:4000043998 01056155355
24小时电话:010-56159998
投诉电话:18910191973
值班售后/技术支持
售后服务/财务
备案专员
紧急电话:18610088800