介绍另外一种重要的数据变更日志,也就是InnoDB change buffer。Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。

•本期我们介绍另外一种重要的数据变更日志,也就是InnoDB change buffer。Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。•内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page);•InnoDB以变种LRU算法管理缓冲池,并能够解决“预读失效”与“缓冲池污染”的问题;•毫无疑问,对于读请求,缓冲池能够减少磁盘IO,提升性能。问题来了,那写请求呢?

Mysql写入数据原理-无 Change Buffer

示例一

假如要修改页号为4的索引页,而这个页正好在缓冲池内。


1.直接修改缓冲池的数据页,一次内存操作。2.写入redo log日志数据变化,一次磁盘顺序写操作。

PS:1. 像写redo log日志这种顺序IO写操作,每秒几万次都没有什么问题!什么时候缓冲池中的页,会刷到磁盘上呢 ?定期刷磁盘,而不是每次刷磁盘,能够降低磁盘IO,提升MySQL的性能。

示例二

假如要修改页号为40的索引页,而这个页正好不在缓冲池内。


1.先把数据页号为40的索引页,从磁盘加载到缓冲池中,一次磁盘随机读操作。2.修改内存缓冲池的数据页,一次内存操作。3.写入redo log日志数据变换,一次磁盘顺序写操作。

Mysql写入数据原理-有 Change Buffer

•没有命中缓冲池的时候,至少产生一次磁盘IO,对于写多读少的业务场景,是否还有优化的空间呢?•下面介绍Change Buffer,从名字容易看出,写缓冲是降低磁盘IO,提升数据库写性能的一种机制。

什么是InnoDB的写缓冲?

在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。它是一种应用在非唯一普通索引页(non-unique secondary index page)不在缓冲池中,对页进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(buffer changes),等未来数据被读取时,再将数据合并(merge)恢复到缓冲池中的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。

示例三

•InnoDB加入写缓冲优化,上文“示例二”流程会有什么变化?•假如要修改页号为40的索引页,而这个页正好不在缓冲池内。


1.在写缓冲区( Change Buffer )中记录这个操作,一次内存操作。2.写入redo log日志数据变化,一次磁盘顺序写操作。

PS:可以看到,数据页号为40这一页,并没有加载到缓冲池中。此时如果MySQL Crash,可以从redo log日志恢复数据。写缓冲区( Change Buffer )不是一个内存结构,它也会被定期执行刷新操作,写入缓冲系统表空间。

示例四

•数据读取时,有另外的流程,将数据合并到缓冲池;•基于示例三后的一个短时间内,有请求查询索引页40的数据。


1.加载数据页号为40的索引页到缓冲池中,缓冲池未命中,这次磁盘IO无法避免。2.然后从缓冲池中读取数据页号为40的数据信息。3.将数据页号为40的索引页,放到缓冲池LRU内( LRU算法管理缓冲池 )

PS:可以看到,40这一页,在真正被读取时,才会被加载到缓冲池中。

为什么写缓冲优化,仅适用于非唯一普通索引页呢?

如果索引设置了唯一(unique)属性,在进行修改操作时,InnoDB必须进行唯一性检查。也就是说,索引页即使在缓冲池,磁盘上的数据页读取无法避免(否则怎么校验是否唯一?),此时就应该直接把相应的页放入缓冲池再进行修改,而不应该再搞写缓冲池这个东东。

哪些场景会触发刷写缓冲中的数据呢?

•有一个后台线程,认为数据库空闲时;•数据库缓冲池不够用时;•数据库正常关闭时;•redo log写满时;

PS:redo log一般不会被写满的,如果整个数据库处于无法写入和不可用的状态。

什么业务场景,适合开启InnoDB的写缓冲机制?

适合场景

•数据库大部分是非唯一索引。•业务是写多读少,不是写入数据后要立刻读取的。

PS:将原本每次写入都需要进行磁盘IO的SQL,优化定期批量写磁盘。场景:例如账单流水业务、用户行为记录

不适合场景

•数据库大部分是唯一索引。•写入一个数据后,会立刻读取它。

PS:如果写入数据后立刻要读取,反而写缓存反倒成了负担,增加了复杂度。场景:银行卡余额

对应InnoDB里哪些参数?

root@localhost:mysql.sock 16:09:59[(none)]> show variables like 'innodb_change%';+-------------------------------+-------+| Variable_name                 | Value |+-------------------------------+-------+| innodb_change_buffer_max_size | 25    || innodb_change_buffering       | all   |+-------------------------------+-------+2 rows in set (0.01 sec)

•innodb_change_buffer_max_size 配置写缓冲的大小,占整个缓冲池的比例,默认值是25%,最大值是50%。•innodb_change_buffering 配置哪些写操作启用写缓冲,可以设置成all/none/inserts/deletes等。

原创作者:老A

原创地址:https://dbawsp.com/1878.html

写入mysql_MySQL写入缓冲区在数据库中的作用( Change Buffer )相关推荐

  1. MySQL利用磁盘缓存写入_MySQL写入缓冲区在数据库中的作用( Change Buffer )

    原标题:MySQL写入缓冲区在数据库中的作用( Change Buffer ) 介绍另外一种重要的数据变更日志,也就是InnoDB change buffer.Change buffer的主要目的是将 ...

  2. mysql 数据缓冲区,MySQL写入缓冲区在数据库中的作用( Change Buffer )

    原标题:MySQL写入缓冲区在数据库中的作用( Change Buffer ) 介绍另外一种重要的数据变更日志,也就是InnoDB change buffer.Change buffer的主要目的是将 ...

  3. 统计信息在数据库中的作用_统计在行业中的作用

    统计信息在数据库中的作用 数据科学与机器学习 (DATA SCIENCE AND MACHINE LEARNING) Statistics are everywhere, and most indus ...

  4. mysql中储存过程的作用_存储过程在数据库中的作用是什么

    存储过程在数据库中的作用:1.存储过程可接受参数.输出参数.返回单个或多个结果集及返回值:2.存储过程运行比较稳定,不会有太多的错误:3.存储过程主要是在服务器上运行,减少对客户机的压力. 存储过程在 ...

  5. DStream输出之使用foreachRDD()将数据写入诸如Mysql的外部数据库中

    前言 输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库或输出到屏幕上).与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作 ...

  6. java 序列化 写入mysql_java 序列化到mysql数据库中

    使用hibernate跟数据库打交道 hibernate配置文件如下 /p> "-//Hibernate/Hibernate Configuration DTD 3.0//EN&quo ...

  7. php图片写入带问号_PHP在数据库中显示的是问号

    下面这个数据能进入数据库,但是出来的是问号,请问如何解决<?phpclassmysql {private$host;private$name;private$pass;private$table ...

  8. php中怎么连接数据库中的表,php 连接 excel表格数据库数据-php中如何将execl的数据导入到数据库中...

    php中如何将execl的数据导入到数据库中 php导出大量数据的Excel: PHP从数据库分多次读取100万行记录,和分多次将100万行写入文本文件都没问题 Excel可以支持100万行记录,Ex ...

  9. python查数据库写入excel_【Python】将数据库中的数据查询出来自动写入excel文档...

    近期每天都要监控一个数据. 第一个版本是这样的: 每天新增一个文档来汇总这个数据.这样搞了几天之后,过了一个周末,过来突然发现数据变多了很多,这个时候要调整策略,直接一个文档汇总出要的数据就可以了. ...

最新文章

  1. taskset -pc PID 查看线程占用cpu核
  2. oracle-Oracle试题
  3. c语言兔子繁殖问题分析和递归方程,经典的兔子生兔子问题(C#递归解法)
  4. 上银伺服驱动器说明书_威海伺服驱动器维修,诚信互利
  5. 《专家手记AJAX开发实战 》电子试读版发布
  6. iOS语言中的KVO机制
  7. [照片]51cto众生相
  8. 编译环境 Golang开发环境 vscode+git
  9. oracle 按汉字拼音顺序排序
  10. Python调用Matplotlib绘制分布点图
  11. 木兰词·拟古决绝词柬友
  12. 深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)
  13. Linux —— wget -qO- 命令详解
  14. 和平精英2023年五月和平小店返场皮肤有哪些
  15. 学习Python:StringIO与cStringIO
  16. 如何将低版本的CAD转换器转换成高版本
  17. 别人的18岁,恐怕会碾压你的38岁
  18. echarts设置柱形图宽度 最大宽度 最小宽度
  19. 计算机找不到def,我打开计算机,发现缺少def驱动器. C盘发生了什么?如何解决def驱动器消失的问题?...
  20. 微信按住说话HTML实现

热门文章

  1. ubuntu 更新系统时间
  2. iOS经常使用加密方式(MD5,AES,BASE64)与网络数据安全
  3. Unity Game Starter Kit for Windows Store and Windows Phone Store games
  4. Flash读取xml奥秘
  5. 李开复给中国学生的第六封信:选择的智慧
  6. Sql Server 2005自定义分页
  7. card2phone android,Installing application on SD-card in Android sdk 2.2
  8. 【Paper】2016_Cooperative UAV-UGV modeled by Petri Net Plans specification
  9. 5.8 程序示例--线性分类-机器学习笔记-斯坦福吴恩达教授
  10. 2.2 逻辑回归-机器学习笔记-斯坦福吴恩达教授