MySQL脏页刷盘流程

1. 什么是脏页

  • InnoDB更新语句,是先查询到指定记录到内存缓冲区,然后更新内存缓冲区数据,再写redo log。并不会立即将数据页刷新到磁盘上。这样就会导致内存数据页和磁盘数据页的数据不一致的情况。这种数据不一致的数据页成为脏页。当脏页写入到磁盘后(flush),数据一致性后称为干净页

2. 关于Innodb刷盘的策略

  • 对于数据更新操作,存储引擎会将数据页先加载到内存缓冲池,然后修改内存中该数据页的内容。这样就会产生脏页,脏页需要刷新到磁盘才能保证对数据表的更新被持久化。
  • 但是如果更新一条记录就需要将一个页刷盘一次,则这个开销就有点太大。太多次IO操作非常影响性能。
  • 所以存储引擎对于内存数据页的修改,不是一有修改就会刷盘,而是达到一定的阈值才会去刷盘。那么就会产生一个问题,如果此时数据库宕机了,则内存的的脏数据页会没有完成刷盘就丢失了。这样就会导致有些更新被丢失了。
  • 因此InnoDB存储引擎引入了redo日志,在数据库对内存数据页的更新后会先将更新日志写入redo日志的内存缓冲区中,当redo日志的内存缓冲区中的日志写入redo日志的磁盘文件上,就表示这个操作完成了持久化。然后存储引擎在合适的时间再将数据脏页刷回磁盘。
    • 可能你会问,redo日志的内存缓冲区中的日志写入redo日志的磁盘文件上,也是需要IO啊,为什么不直接将数据页写入磁盘呢?
    • 因为redo日志写入磁盘文件这个过程时顺序存储的(在磁盘文件的尾部追加即可)。而IO刷盘是随机存储的(需要寻找刷新的磁盘位置)。所以redo日志写入磁盘的速度远远快于数据的刷盘。

3. 什么时候会flush脏页

  1. 磁盘上的redo log日志文件写满时:redo log大小固定,写完后会循环覆盖写入,写满后当有新内容要写入时,系统必须停止所有的更新操作,将checkpoint向前推进到新的位置,但是在推进之前必须将覆盖部分的所有脏页都flush到磁盘上
  2. 内存不足需要淘汰数据页。如果淘汰的是脏页,则需要将这些脏页刷盘。
  3. 系统空闲的时候后台会定期flush适量的脏页到磁盘。
  4. MySQL正常关闭时,会把所有脏页都flush到磁盘。

4. flush对系统性能的影响

  • 前两种会造成系统新能问题。第三种系统空闲所有不会有性能问题。第四种要关闭自然也不用考虑性能问题。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值