innodb的写缓存,其设计思想同样是为了减少磁盘的io来提升性能。

对于数据库的写来说,有如下两种情况

1. 修改的内容所在页在缓冲池内

会有如下两步操作

  1. 直接修改缓冲池中的页,一次内存操作

  2. 写入redo log,一次磁盘顺序写操作

那什么时候数据会把修改的数据落盘呢,他会进行定期刷盘,如果没有等到刷盘时间,数据就被从缓存淘汰,就会把脏页刷回磁盘。这样能减少io次数,提升性能。把随机写变成顺序写和批量写,这是优化程序性能的有效方式。

这样数据在读取怎么保持一致性,数据库异常的时候是怎么处理的呢

  1. 读取:会命中缓冲池的页,而不是从磁盘获取
  2. 缓冲池数据淘汰,会将“脏页”刷回磁盘
  3. 数据库异常崩溃,能够从redo log中恢复

2.修改的内容所在页不在缓冲池内

这种情况略为复杂一些,常见的操作是先把数据从磁盘中读取到缓存中,一般操作系统的缓存都是这样处理的。步骤如下:

  1. 先把需要写的页,从磁盘加载到缓冲池,一次磁盘随机读操作
  2. 修改缓冲池中的页,一次内存操作
  3. 写入redo log,一次磁盘顺序写操作

这期间可能触发LRU淘汰我们就不分析了。

但是这个时候,使用缓存和不使用缓存,都是需要一次磁盘随机读的,这样就会导致写的效率比较低。

innodb的解决方案

innodb提升数据库写性能是通过写缓冲(change buffer)来实现的,他的主要作用就是当要写入的页不在缓存中的时候,并不把这个页读取到缓存中来,而只是记录这次更改,在读取这页数据的时候或者写磁盘的时候,再把这次更改和磁盘数据合并,放入缓存中。

在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。

写缓存优点

对于情况1中,其实没有什么影响,但是对于情况二,从原来的操作变成了如下的操作,省去了一次磁盘io

  1. 在写缓冲中记录这个操作,一次内存操作
  2. 写入redo log,一次磁盘顺序写操作

但是这里要注意,写缓冲中记录的是操作而不是完整的数据。

那么这种操作是否会影响读操作或者带来数据一致性问题呢

  1. 数据读取时,将数据合并到缓冲池中(所以写后一定会读取的数据,不适合用写缓存)
  2. 数据库异常奔溃,能够从redo log中恢复数据
  3. 写缓冲不只是一个内存结构,它也会被定期刷盘到写缓冲系统表空间

2和3我们不做详解,我们说一下读取的时候发生了什么

因为这一页不在缓存池中,如果发生了读取,则必定会触发磁盘读,这个时候会从写缓存中读出相关的操作,把操作和数据进行合并处理,放入缓存池中。

写缓存的限制

写缓冲优化,仅适用于非唯一普通索引,这是因为如果索引设置了唯一(unique)属性,在进行修改操作时,InnoDB必须进行唯一性检查。这样就必须读取所有的索引数据到缓冲池进行判断是否唯一,磁盘io不可避免,所以写缓存减少磁盘io的意义就不存在了。这时候就采用常规流程,直接把页放到内存中,然后再修改。

写缓冲的刷盘

  1. 是缓冲都会有缓冲池大小,数据库缓冲池不够用时就会触发刷盘
  2. 有一个后台线程,会认为数据库空闲时;
  3. 数据库正常关闭时;

使用写缓冲的场景和参数设置

  • 数据库大部分是非唯一索引
  • 业务是写多读少,或者不是写后立刻读取(立即读取就会触发磁盘io,相当于给你省了,你马上又浪费了。)

mysql参数

参数:innodb_change_buffer_max_size

说明:配置写缓冲的大小,占整个缓冲池的比例,默认值是25%,最大值是50%。

参数:innodb_change_buffering

说明:配置哪些写操作启用写缓冲,可以设置成all/none/inserts/deletes等。

可使用mysql查询参数的命令进行查询

show variables like '%【上面的参数】%';

innodb的写缓存相关推荐

  1. mysql写缓冲_MySQL 数据库的提速器-写缓存(Change Buffer)

    写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...

  2. MySQL 数据库的提速器-写缓存(Change Buffer)

    写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...

  3. 写缓存java,编写线程安全的Java缓存读写机制 (原创)

    一种习以为常的缓存写法: IF value in cached THEN return value from cache ELSE compute value save value in cache ...

  4. Oracle 日志的核心意义(快速提交,写缓存,回滚)

    这篇文章是参考甲骨论老相老师的教学视频 http://v.youku.com/v_show/id_XMzk1MDA3NjA4.html 所做的学习笔记 1.Oracle有1个重要的原则.        ...

  5. 无盘服务器读写缓存,无盘系统中实现网络磁盘本地写缓存控制的方法

    1. 一种无盘系统中实现网络磁盘本地写缓存控制的方法,所述的无盘系统中包括通过 网络与远程服务器相连接的客户端,其特征在于,所述的方法包括以下步骤:(1)客户端进行启动和初始化操作:(2)客户端根据服 ...

  6. xpe低配置系统解决“写缓存失败”问题

        在做好的带有RAM 模式的EWF功能的XPE系统时,我们会关注当前的硬件配置是否足够支持RAM的写保护的消耗,如果配置太低的话在系统运行过程中就会出现这样或那样的问题,如果内存低于100M,你 ...

  7. linux centos用smartctl 打开硬盘写缓存

    yum install smartmontools 安装工具 smartctl -x /dev/sda 查看硬盘信息,查看Write cache状态. smartctl -s wcache,on /d ...

  8. 189.HBase(三):master架构,RegionServer架构,写流程,写缓存的刷写,HFile,读流程,合并读取的数据,store文件合并,region分区

    目录 一.Master架构 二.RegionServer架构 三.写流程 四.写缓存的刷写 五.HFile结构

  9. 先写数据库还是先写缓存

    关于维护一份数据是先写数据库,还是先写缓存的问题,很多朋友发表了自己的看法,本文来谈谈我的看法.我的结论非常清晰明确:先写数据库再写缓存.核心思想是数据库和缓存之间追求最终一致性,不追求强一致性. ( ...

最新文章

  1. javascript之温习闭包
  2. Android性能测试-分析工具
  3. 二维码原理--开胃小知识
  4. 【linux】【firewalld】防火墙设置
  5. [数据库] Navicat for MySQL触发器更新和插入操作
  6. Android开发之可以在临界点左右滑动的ViewPager
  7. strtoupper 小写_PHP strtoupper()函数与示例
  8. 机器学习(八)支持向量机svm终结篇
  9. java 通过 socket 实现 服务器和客户端的通信 TCP
  10. js设置radio单选框值选中
  11. ARM-QT5.14.2 触摸屏配置(电容屏/电阻屏)
  12. NPN与PNP的区别
  13. CSS案例——静态网页制作
  14. 计算机格式为gpt怎么更改,硬盘格式转换,手把手教你如何将硬盘mbr格式转换为gpt格式...
  15. 区块如何防篡改_区块链为什么能防篡改?
  16. 【它来了】搭载龙芯3A4000的国产办公电脑-桌面型机箱来了~
  17. 4个小方法,让你的抖音发出来的视频更清楚
  18. 纯Web前端打造的元宇宙展厅——开箱即用的Lingo3D游戏引擎 支持原生、React、Vue
  19. 11.编写COM常用IDL指令和注意事项详解
  20. JS(Javascript)调用Android原生方法三步走

热门文章

  1. C++:最小二乘法拟合直线
  2. 001-unity2D游戏随机生成地图
  3. Windows 组策略修改 之 初始化文件 %windir%\inf\defltbase.inf
  4. C中输入半径计算球体的体积
  5. legacy引导gpt分区_UEFI+GPT、Legacy+MBR引导模式介绍 引导修复
  6. 如何将数据传至服务器系统,怎样将数据传至云服务器
  7. 【HTML】简单的书签式菜单选择设置
  8. 妈蛋的,写篇博客~~
  9. SparkSQL之UDF、UDAF、UDTF
  10. WebSocket的学习