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结构
- 先写数据库还是先写缓存
关于维护一份数据是先写数据库,还是先写缓存的问题,很多朋友发表了自己的看法,本文来谈谈我的看法.我的结论非常清晰明确:先写数据库再写缓存.核心思想是数据库和缓存之间追求最终一致性,不追求强一致性. ( ...
最新文章
- linux vim配置注释,vim自动添加注释
- 1128 N Queens Puzzle (20 分)【难度: 一般 / 知识点: 模拟】
- window实用快捷键
- 字典,和字典的增删改查
- 5月5日——更改手机状态栏的背景颜色
- rup 裁剪_裁剪师是什么意思
- node版本管理和npm源管理工具
- 十年期货股票行情数据轻松处理——TDengine在同心源基金的应用
- PDA开发从入门到精通
- k2p华硕系统怎么设置_双频路由器怎么设置网速快(k2p刷华硕怎么设置网速好)
- LCD/OLED点阵字模提取软件(汇总)
- 幻幕广告上线,沉浸式体验塑造大片即视感
- 百度UEditor 整合135编辑器到功能栏
- (转)游戏运营18种方式
- 理解Nand Flash原理图
- 2007noip提高组初赛总结
- vue列表进入详情页实现上一篇下一篇功能
- Db2 V11设计与调优 --- IBM中文官网
- 云计算之阿里云认证题库解析
- 【sql随笔】sql题目:查询每班成绩前三名
热门文章
- 【老鸟进阶】deepfacelab如何让融合更自然(二)清晰度篇
- Node.js中的egg入门、egg路由、egg控制器、egg服务、egg中间件
- 使用autoware的calibration_toolkit联合标定双目相机和激光雷达(ZED and VLP-16)
- TCP重连重试机制——记一次线上故障排查思考
- drtek收音机使用说明_德劲1103收音机【简易操作指南】.【使用说明书】.高清版...
- 关于逸马驰骋兄转移数据库的一种方案(记录下)
- 语音识别发展史与入门书籍简介
- 群晖用php装aria2,NAS群晖DSM5.2小白教程:一行命令用 Docker 架设 aria2 服务 首发
- 什么是成本:(一)支出、费用及成本的关系
- UnityShader水墨渲染的尝试