innodb的写缓存
innodb的写缓存,其设计思想同样是为了减少磁盘的io来提升性能。
对于数据库的写来说,有如下两种情况
1. 修改的内容所在页在缓冲池内
会有如下两步操作
直接修改缓冲池中的页,一次内存操作
写入redo log,一次磁盘顺序写操作
那什么时候数据会把修改的数据落盘呢,他会进行定期刷盘,如果没有等到刷盘时间,数据就被从缓存淘汰,就会把脏页刷回磁盘。这样能减少io次数,提升性能。把随机写变成顺序写和批量写,这是优化程序性能的有效方式。
这样数据在读取怎么保持一致性,数据库异常的时候是怎么处理的呢
- 读取:会命中缓冲池的页,而不是从磁盘获取
- 缓冲池数据淘汰,会将“脏页”刷回磁盘
- 数据库异常崩溃,能够从redo log中恢复
2.修改的内容所在页不在缓冲池内
这种情况略为复杂一些,常见的操作是先把数据从磁盘中读取到缓存中,一般操作系统的缓存都是这样处理的。步骤如下:
- 先把需要写的页,从磁盘加载到缓冲池,一次磁盘随机读操作
- 修改缓冲池中的页,一次内存操作
- 写入redo log,一次磁盘顺序写操作
这期间可能触发LRU淘汰我们就不分析了。
但是这个时候,使用缓存和不使用缓存,都是需要一次磁盘随机读的,这样就会导致写的效率比较低。
innodb的解决方案
innodb提升数据库写性能是通过写缓冲(change buffer)来实现的,他的主要作用就是当要写入的页不在缓存中的时候,并不把这个页读取到缓存中来,而只是记录这次更改,在读取这页数据的时候或者写磁盘的时候,再把这次更改和磁盘数据合并,放入缓存中。
在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。
写缓存优点
对于情况1中,其实没有什么影响,但是对于情况二,从原来的操作变成了如下的操作,省去了一次磁盘io
- 在写缓冲中记录这个操作,一次内存操作
- 写入redo log,一次磁盘顺序写操作
但是这里要注意,写缓冲中记录的是操作而不是完整的数据。
那么这种操作是否会影响读操作或者带来数据一致性问题呢
- 数据读取时,将数据合并到缓冲池中(所以写后一定会读取的数据,不适合用写缓存)
- 数据库异常奔溃,能够从redo log中恢复数据
- 写缓冲不只是一个内存结构,它也会被定期刷盘到写缓冲系统表空间
2和3我们不做详解,我们说一下读取的时候发生了什么
因为这一页不在缓存池中,如果发生了读取,则必定会触发磁盘读,这个时候会从写缓存中读出相关的操作,把操作和数据进行合并处理,放入缓存池中。
写缓存的限制
写缓冲优化,仅适用于非唯一普通索引,这是因为如果索引设置了唯一(unique)属性,在进行修改操作时,InnoDB必须进行唯一性检查。这样就必须读取所有的索引数据到缓冲池进行判断是否唯一,磁盘io不可避免,所以写缓存减少磁盘io的意义就不存在了。这时候就采用常规流程,直接把页放到内存中,然后再修改。
写缓冲的刷盘
- 是缓冲都会有缓冲池大小,数据库缓冲池不够用时就会触发刷盘
- 有一个后台线程,会认为数据库空闲时;
- 数据库正常关闭时;
使用写缓冲的场景和参数设置
- 数据库大部分是非唯一索引
- 业务是写多读少,或者不是写后立刻读取(立即读取就会触发磁盘io,相当于给你省了,你马上又浪费了。)
mysql参数
参数:innodb_change_buffer_max_size
说明:配置写缓冲的大小,占整个缓冲池的比例,默认值是25%,最大值是50%。
参数:innodb_change_buffering
说明:配置哪些写操作启用写缓冲,可以设置成all/none/inserts/deletes等。
可使用mysql查询参数的命令进行查询
show variables like '%【上面的参数】%';
innodb的写缓存相关推荐
- mysql写缓冲_MySQL 数据库的提速器-写缓存(Change Buffer)
写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...
- MySQL 数据库的提速器-写缓存(Change Buffer)
写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...
- 写缓存java,编写线程安全的Java缓存读写机制 (原创)
一种习以为常的缓存写法: IF value in cached THEN return value from cache ELSE compute value save value in cache ...
- Oracle 日志的核心意义(快速提交,写缓存,回滚)
这篇文章是参考甲骨论老相老师的教学视频 http://v.youku.com/v_show/id_XMzk1MDA3NjA4.html 所做的学习笔记 1.Oracle有1个重要的原则. ...
- 无盘服务器读写缓存,无盘系统中实现网络磁盘本地写缓存控制的方法
1. 一种无盘系统中实现网络磁盘本地写缓存控制的方法,所述的无盘系统中包括通过 网络与远程服务器相连接的客户端,其特征在于,所述的方法包括以下步骤:(1)客户端进行启动和初始化操作:(2)客户端根据服 ...
- xpe低配置系统解决“写缓存失败”问题
在做好的带有RAM 模式的EWF功能的XPE系统时,我们会关注当前的硬件配置是否足够支持RAM的写保护的消耗,如果配置太低的话在系统运行过程中就会出现这样或那样的问题,如果内存低于100M,你 ...
- linux centos用smartctl 打开硬盘写缓存
yum install smartmontools 安装工具 smartctl -x /dev/sda 查看硬盘信息,查看Write cache状态. smartctl -s wcache,on /d ...
- 189.HBase(三):master架构,RegionServer架构,写流程,写缓存的刷写,HFile,读流程,合并读取的数据,store文件合并,region分区
目录 一.Master架构 二.RegionServer架构 三.写流程 四.写缓存的刷写 五.HFile结构
- 先写数据库还是先写缓存
关于维护一份数据是先写数据库,还是先写缓存的问题,很多朋友发表了自己的看法,本文来谈谈我的看法.我的结论非常清晰明确:先写数据库再写缓存.核心思想是数据库和缓存之间追求最终一致性,不追求强一致性. ( ...
最新文章
- javascript之温习闭包
- Android性能测试-分析工具
- 二维码原理--开胃小知识
- 【linux】【firewalld】防火墙设置
- [数据库] Navicat for MySQL触发器更新和插入操作
- Android开发之可以在临界点左右滑动的ViewPager
- strtoupper 小写_PHP strtoupper()函数与示例
- 机器学习(八)支持向量机svm终结篇
- java 通过 socket 实现 服务器和客户端的通信 TCP
- js设置radio单选框值选中
- ARM-QT5.14.2 触摸屏配置(电容屏/电阻屏)
- NPN与PNP的区别
- CSS案例——静态网页制作
- 计算机格式为gpt怎么更改,硬盘格式转换,手把手教你如何将硬盘mbr格式转换为gpt格式...
- 区块如何防篡改_区块链为什么能防篡改?
- 【它来了】搭载龙芯3A4000的国产办公电脑-桌面型机箱来了~
- 4个小方法,让你的抖音发出来的视频更清楚
- 纯Web前端打造的元宇宙展厅——开箱即用的Lingo3D游戏引擎 支持原生、React、Vue
- 11.编写COM常用IDL指令和注意事项详解
- JS(Javascript)调用Android原生方法三步走