MySQL的刷脏机制
文章目录
- 缓冲池 Buffer Pool
- 刷脏页的时机
- MySQL定时刷
- MySQL内存(buffer pool)不足的时候
- MySQL正常关闭的时候
- redo log满了的时候
- 刷脏导致的性能问题
- 控制刷脏页速度的因素
先了解下前置知识:
缓冲池 Buffer Pool
首先,对于InnoDB存储引擎来说,数据都是放在磁盘上的,存储引擎要操作数据,必须先把磁盘里面的数据加载到内存里面才可以操作。
这里就有个问题,是不是我们需要的数据多大,我们就一次从磁盘加载多少数据到内存呢?比如我要读6个字节。
磁盘I/O的读写相对于内存的操作来说是很慢的。如果我们需要的数据分散在磁盘的不同的地方,那就意味着会产生很多次的I/O操作。
所以,无论是操作系统也好,还是存储引擎也好,都有一个预读取的概念。也就是说,当磁盘上的一块数据被读取的时候,很有可能它附近的位置也会马上被读取到,这个就叫做局部性原理。那么这样,我们干脆每次多读取一点,而不是用多少读多少。
InnoDB设定了一个存储引擎从磁盘读取数据到内存的最小的单位,叫做页。操作系统也有页的概念。操作系统的页大小一般是4K,而在InnoDB里面,这个最小的单位默认是16KB大小。如果要修改这个值的大小,需要清空数据重新初始化服务。
举个例子,你去烧烤店跟老板说,老板,来一个生蚝。他根本不卖,懒得给你烤。老板卖给你生蚝,就是一打一打地卖。
我们要操作的数据就在这样的页里面,数据所在的页叫数据页。
这里有一个问题,操作数据的时候,每次都要从磁盘读取到内存(再返回给Server),有没有什么办法可以提高效率?
还是缓存的思想。把读取过的数据页缓存起来。
InnoDB设计了一个内存的缓冲区。读取数据的时候,先判断是不是在这个内存区域里面,如果是,就直接读取,然后操作,不用再次从磁盘加载。如果不是,读取后就写到这个内存的缓冲区。
这个内存区域有个专属的名字,叫 Buffer Pool。
修改数据的时候,也是先写入到 buffer pool,而不是直接写到磁盘。当数据在缓存中,也就是内存的数据页和磁盘数据不一致的时候,我们把它叫做脏页。那脏页什么时候才同步到磁盘呢?
InnoDB里面有专门的后台线程把Buffer Pool的数据写入到磁盘,每隔一段时间就一次性地把多个修改写入磁盘,这个动作就叫做刷脏。
刷脏页的时机
MySQL定时刷
MySQL会在自认为系统“空闲”的时候或者当系统更新很频繁,redo log很快就写满的情况下,合理的定时进行刷脏
MySQL内存(buffer pool)不足的时候
当需要将数据页读到内存中时,发现内存不够了,就需要淘汰掉内存中最不经常使用的数据页,空出内存给别的数据页使用,如果淘汰的是“脏页”,就要先把脏页写到磁盘中。
MySQL正常关闭的时候
如果关闭的时候不刷脏,启动的时候就需要去读redo log然后同步数据到磁盘,这样启动速度会变慢。
redo log满了的时候
redo log写满的时候,整个系统就不能再接收更新了,所有的更新必须都阻塞住。这种情况要尽量避免。
刷脏导致的性能问题
一个查询要淘汰的脏页个数太多,会导致查询的相应时间明显变长
日志写满,更新全部读,写性能跌为0,这种情况对敏感业务来说,是不能接受的
因此InnoDB要控制脏页比例,来尽量避免这两种情况
需要正确告诉InnoDB所在主机的IO能力,这样InnoDB才能知道需要全力刷脏页的时候,可以刷多快。
可以通innodb_io_capacity参数来控制InnoDB的刷盘能力,这个值建议设置成磁盘的IOPS,通过fio工具可以测试出磁盘的IOPS,命令如下:
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
innodb_io_capacity的默认值为200,正确配置innodb_io_capacity可以发挥机器的性能,错误配置也会导致性能问题,比如使用SSD的硬盘就可以将这个值配大些,但是也不能配置过大,配置过大会导致InnoDB把磁盘的能力全用来刷脏页了,不能服务用户请求。
控制刷脏页速度的因素
如果刷脏页慢,会导致内存脏页太多,其次是redo log写满(因为脏页还没有同步到磁盘,redo log就不能覆写)。
InnoDB的刷盘速度就通过脏页比例和redo log写盘速度来控制的.
为了减少刷脏给业务带来的影响,要合理的设置innodb_io_capacity的值,并且平时要多关注脏页比例,不要让它经常解决75%。
--脏页比例计算:
select VARIABLE_VALUE into @a from performance_schema.global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b from performance_schema.global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;
连带机制
一旦一个查询请求需要在执行过程中刷掉一个脏页时,这个查询就可能要比平时慢了,MySQL中的一个机制可能会让查询更慢。
在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉,并且这个逻辑会继续蔓延。
通过innodb_flush_neighbors可以控制这个行为,值为1的时候会有上述的连带机制,MySQL8.0以下默认为1。
建议:
当使用的是机械硬盘时,建议开启,这样可以减少很多的随机IO
当使用的是固态硬盘这类IOPS比较高的设备时,建议关闭,因为这个时候IOPS往往不是瓶颈,这样可以减少SQL的响应时间
MySQL的刷脏机制相关推荐
- mysql ssd 刷脏,InnoDB的刷脏机制
Page Cleaner InnoDB 通过独立的线程将Buffer Pool中的脏页刷入存储中.这些线程称作Page Cleaner. Page Cleaner的线程数量通过系统参数--innodb ...
- mysql ssd 刷脏_MySQL-Innodb-批量刷脏的场景
buf_flush_page_cleaner_coordinator协调线程的主循环主线程以最多1s的间隔或者收到buf_flush_event事件就会触发进行一轮的刷脏. 批量刷脏主要有3个场景. ...
- [MySQL] 日志刷盘机制
概念 MySQL的InnoDB日志管理机制中,有一个概念叫MTR(mini-transaction). MySQL中把对底层页面的一次原子访问的过程称之为一个Mini-Transaction,这里的原 ...
- mysql什么情况会刷脏页_mysql-刷脏页(12)
一,mysql因为WAL机制,在更新时,首先会更新内存,再写redo log.一般情况下是在空闲时,将redo log刷新到磁盘中. 二,什么是脏页.当内存中与磁盘中的数据不一致时,内存中的数据页就称 ...
- mysql刷脏页的原理_Mysql脏页flush及收缩表空间原理解析
mysql脏页 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功. 把内存里的数据写入磁盘的过 ...
- mysql刷盘机制详解
目录 刷盘机制总览 log buffer(innodb的,由存储引擎分配) binlog cache(由server分配) buffer pool 自适应刷脏页Adaptive Flushing 刷盘 ...
- MySQL数据和日志的刷盘机制以及双一配置
详细介绍了MySQL数据和日志的刷盘机制以及双一配置,双一配置可以保证Mysql日志数据不丢失. 文章目录 1 内存数据的刷盘机制 2 MySQL数据的刷盘 2.1 刷盘数据来源 2.2 脏页以及刷盘 ...
- 《MySQL实战45讲》——学习笔记12 “InnoDB刷脏页的控制策略“
本篇介绍MYSQL InnoDB的WAL机制带来的小问题--利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,但也带来了内存脏页的问题: 脏页会被后台线程自动flush,也会由于数 ...
- 针对 MySQL/InnoDB 刷盘调优
原文 https://www.percona.com/blog/2020/05/14/tuning-mysql-innodb-flushing-for-a-write-intensive-worklo ...
- 检查点 机制mysql_【mysql】关于checkpoint机制
一.简介 思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘.因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时 ...
最新文章
- xbox acc驱动win7_Xbox老大:希望第一方工作室能推出更多单机游戏_电竞
- Eclipse基本使用
- 初中数学四十二个几何模型_陪伴成长的初中数学几何模型大全
- 我使用过的Linux命令之clear - 清除终端屏幕,不是cls
- 【STM32】FreeRTOS任务相关API
- 新建和发布Windows服务的几个常见问题
- Apache Camel 2.19发布–新增功能
- 转载 ---资深HR告诉你:我如何筛选简历与选择人员的
- java观察者模式学习
- Unity shader实现水效果(折射,反射,波浪,1.菲尼尔,深度颜色)
- 2021年Java开发者应该学习的技术
- 24.redis持久化之AOF
- oracle10g lsnrctl,Oracle10g 服务丢失处理办法
- 震惊!Redis 的字符串居然是这样实现的…
- mysql数据库d盘_Windows Server 2008 R2下修改MySQL 5.5数据库目录为D盘
- 【学习笔记】程序设计导引及在线实践 数值转换问题
- 不只是AlphaGo,谷歌DeepMind到底是何方神圣?
- ogg与wav格式转换
- 【合天网安】利用sqlmap辅助手工注入
- JAVA实现战舰游戏
热门文章
- 【CSS 书写模式 (Writing modes )】
- 八爪鱼采集ajax表格,怎么采集八爪鱼采集器单网页表格信息
- OSChina 周五乱弹 —— 回家切记关机
- 股票交易成本有哪些费用?
- 微观经济学第七周作业(生产函数,规模报酬,投入产出)
- pca 累积方差贡献率公式_SPSS主成分分析时,是不是得到的方差百分比就是贡献率,累计百分比就是累计贡献率??...
- Java在线预览(word转html)--强势推荐
- unity3d meshBaker教程(二) 自动合并
- Zend与PHP之间到底是什么关系
- 没有计算机年代科学家如何计算,难倒了无数科学家的 三体问题