写入mysql_MySQL写入缓冲区在数据库中的作用( Change Buffer )
介绍另外一种重要的数据变更日志,也就是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的索引页,而这个页正好在缓冲池内。
![](/assets/blank.gif)
1.直接修改缓冲池的数据页,一次内存操作。2.写入redo log日志数据变化,一次磁盘顺序写操作。
PS:1. 像写redo log日志这种顺序IO写操作,每秒几万次都没有什么问题!什么时候缓冲池中的页,会刷到磁盘上呢 ?定期刷磁盘,而不是每次刷磁盘,能够降低磁盘IO,提升MySQL的性能。
示例二
假如要修改页号为40的索引页,而这个页正好不在缓冲池内。
![](/assets/blank.gif)
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的索引页,而这个页正好不在缓冲池内。
![](/assets/blank.gif)
1.在写缓冲区( Change Buffer )中记录这个操作,一次内存操作。2.写入redo log日志数据变化,一次磁盘顺序写操作。
PS:可以看到,数据页号为40这一页,并没有加载到缓冲池中。此时如果MySQL Crash,可以从redo log日志恢复数据。写缓冲区( Change Buffer )不是一个内存结构,它也会被定期执行刷新操作,写入缓冲系统表空间。
示例四
•数据读取时,有另外的流程,将数据合并到缓冲池;•基于示例三后的一个短时间内,有请求查询索引页40的数据。
![](/assets/blank.gif)
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 )相关推荐
- MySQL利用磁盘缓存写入_MySQL写入缓冲区在数据库中的作用( Change Buffer )
原标题:MySQL写入缓冲区在数据库中的作用( Change Buffer ) 介绍另外一种重要的数据变更日志,也就是InnoDB change buffer.Change buffer的主要目的是将 ...
- mysql 数据缓冲区,MySQL写入缓冲区在数据库中的作用( Change Buffer )
原标题:MySQL写入缓冲区在数据库中的作用( Change Buffer ) 介绍另外一种重要的数据变更日志,也就是InnoDB change buffer.Change buffer的主要目的是将 ...
- 统计信息在数据库中的作用_统计在行业中的作用
统计信息在数据库中的作用 数据科学与机器学习 (DATA SCIENCE AND MACHINE LEARNING) Statistics are everywhere, and most indus ...
- mysql中储存过程的作用_存储过程在数据库中的作用是什么
存储过程在数据库中的作用:1.存储过程可接受参数.输出参数.返回单个或多个结果集及返回值:2.存储过程运行比较稳定,不会有太多的错误:3.存储过程主要是在服务器上运行,减少对客户机的压力. 存储过程在 ...
- DStream输出之使用foreachRDD()将数据写入诸如Mysql的外部数据库中
前言 输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库或输出到屏幕上).与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作 ...
- java 序列化 写入mysql_java 序列化到mysql数据库中
使用hibernate跟数据库打交道 hibernate配置文件如下 /p> "-//Hibernate/Hibernate Configuration DTD 3.0//EN&quo ...
- php图片写入带问号_PHP在数据库中显示的是问号
下面这个数据能进入数据库,但是出来的是问号,请问如何解决<?phpclassmysql {private$host;private$name;private$pass;private$table ...
- php中怎么连接数据库中的表,php 连接 excel表格数据库数据-php中如何将execl的数据导入到数据库中...
php中如何将execl的数据导入到数据库中 php导出大量数据的Excel: PHP从数据库分多次读取100万行记录,和分多次将100万行写入文本文件都没问题 Excel可以支持100万行记录,Ex ...
- python查数据库写入excel_【Python】将数据库中的数据查询出来自动写入excel文档...
近期每天都要监控一个数据. 第一个版本是这样的: 每天新增一个文档来汇总这个数据.这样搞了几天之后,过了一个周末,过来突然发现数据变多了很多,这个时候要调整策略,直接一个文档汇总出要的数据就可以了. ...
最新文章
- taskset -pc PID 查看线程占用cpu核
- oracle-Oracle试题
- c语言兔子繁殖问题分析和递归方程,经典的兔子生兔子问题(C#递归解法)
- 上银伺服驱动器说明书_威海伺服驱动器维修,诚信互利
- 《专家手记AJAX开发实战 》电子试读版发布
- iOS语言中的KVO机制
- [照片]51cto众生相
- 编译环境 Golang开发环境 vscode+git
- oracle 按汉字拼音顺序排序
- Python调用Matplotlib绘制分布点图
- 木兰词·拟古决绝词柬友
- 深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)
- Linux —— wget -qO- 命令详解
- 和平精英2023年五月和平小店返场皮肤有哪些
- 学习Python:StringIO与cStringIO
- 如何将低版本的CAD转换器转换成高版本
- 别人的18岁,恐怕会碾压你的38岁
- echarts设置柱形图宽度 最大宽度 最小宽度
- 计算机找不到def,我打开计算机,发现缺少def驱动器. C盘发生了什么?如何解决def驱动器消失的问题?...
- 微信按住说话HTML实现
热门文章
- ubuntu 更新系统时间
- iOS经常使用加密方式(MD5,AES,BASE64)与网络数据安全
- Unity Game Starter Kit for Windows Store and Windows Phone Store games
- Flash读取xml奥秘
- 李开复给中国学生的第六封信:选择的智慧
- Sql Server 2005自定义分页
- card2phone android,Installing application on SD-card in Android sdk 2.2
- 【Paper】2016_Cooperative UAV-UGV modeled by Petri Net Plans specification
- 5.8 程序示例--线性分类-机器学习笔记-斯坦福吴恩达教授
- 2.2 逻辑回归-机器学习笔记-斯坦福吴恩达教授