原标题: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的索引页,而这个页正好在缓冲池内。

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.sock16:09:59[(none)]>show variables like'innodb_change%';

+-------------------------------+-------+

|Variable_name|Value|

+-------------------------------+-------+

|innodb_change_buffer_max_size|25|

|innodb_change_buffering|all|

+-------------------------------+-------+

2rowsinset(0.01sec)

•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 )

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

  3. mysql升级后将旧数据迁移到新 数据库中

    mysql升级后将旧数据迁移到新 数据库中 1.将原来数据库进行导出成.sql文件 例:StudentSql.sql 2.进入新数据库的bin目录下 复制bin目录 3.cmd进入bin目录下(需管理 ...

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

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

  5. mysql grant 多个库_mysql grant 多个数据库

    MySQL的权限分配 MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户,如 GRANT PRIVILEGES ON datebase.* to user@ ...

  6. mysql命令行 进入库_MySQL命令行操作数据库

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Serv ...

  7. mysql 创建和删除库_Mysql创建和删除数据库

    很久没有使用命令行操作mysql,百度搜罗,重新整理,加强记忆,便于查询. 以下命令均在win7,64位操作系统下,cmd命令行操作: 一.创建1个mysql 数据库 方法1: 1. cmd下输入:m ...

  8. mysql 5.5 替换字符_Mysql 5.7替换表中某些字段的字符串

    很多时候在做资源迁移的时候,路径改变,存在数据库的资源文件的路径也会跟着改变,所以需要替换存放路径的字符串,如何快速的替换表中的字段的这些字符串呢? 1. 可以通过MySQL的replace函数 re ...

  9. mysql数据库的数据类型转换_MySQL 和Server 2000 数据库中数据类型的转换

    问题阐述 在某些特殊的时候,可能要将MySQL 数据库转换为SQL Server 2000 数据库,这时问题也就随之而来.例如,在MySQL 数据库中,创建的字段使用varchar 类型,该类型的数据 ...

最新文章

  1. 带你3分钟学Python变量和数据类型
  2. php文件什么打开,php文件是什么文件_php文件怎么打开 - 学无忧
  3. Linux--内存结构
  4. mysql绿色版安装
  5. 开源-一步步实现cnblogs博客采集工具-实现过滤设置对话框
  6. 拓端tecdat|R语言估计获胜概率:模拟分析学生多项选择考试通过概率可视化
  7. es6的模块化export和import
  8. 生产系统建模仿真软件FactorySimulation
  9. Java基础编程经典练习题
  10. 【跨越鸿沟】学术界与工业界的GAP有多大?
  11. R Fisher精确检验
  12. Shashlik Cooking(思维)
  13. arp: 查看,为主机添加一个arp 表项
  14. JWT © pepsi-wyl
  15. 【科学文献计量】中英文文献标题及摘要可读性指标分析与可视化
  16. 一堂难忘的计算机课作文,一节电脑课作文600字
  17. ElasticSearch安装、IK、映射、索引管理、搜索管理和集群管理
  18. 院校情报福州大学计算机考研分析,福州大学情报学考研
  19. 通达信7.12服务器文件,通达信金融终端_尘缘整合_V7.12
  20. 乖离率背离公式_乖离率多少才合理 BIAS指标计算公式-BIAS-技术指标-股票入门基础知识学习网...

热门文章

  1. python怎么控制小数点位数_谈谈关于Python里面小数点精度控制的问题
  2. c语言abc变def,C语言的permutation求解
  3. mac 安装laravel Valet环境
  4. 网易云信-新增自定义消息(iOS版)
  5. 分析java程序的命令总结jps,jstack
  6. selenium 安装报错问题
  7. 【每日一linux命令6】命令中的命令
  8. jQuery中append、appendTo、prepend、prependTo、before、insertBefore、after与insertAfter方法注意事项...
  9. Ant 配置文件 ( Google App Engine + GWT + JPA )
  10. BasKet Note Pads-利用软件作条记