为什么我的mysql会抖一下?

当内存数据页跟磁盘数据页不一致的时候,我们称这个内存页为"脏页"。内存数据页到磁盘后,内存和磁盘数据就一致了,称为"干净页"。

什么情况下会发生数据库的flush操作?
1.粉板满了,记不下了,对应的就是redo log写满了,这时候系统需要停止所有更新操作。
这种情况innodb要尽量避免。因为出现这种情况的时候,整个系统都不能再接受更新,所以更新都必须堵住。

2.这一天生意太好,要记住的事情太多,掌柜发现自己快记不住了,赶紧找个账本把孔乙己这笔帐先加进去。
这种场景对应系统内存不足,当需要新的数据页,而内存不够用的时候,就要淘汰一些数据页,空出的内存给别的数据页使用。如果淘汰的是脏页。就要先把脏页写入到磁盘中的。

为什么这里不直接将内存中的数据淘汰掉?这是从性能方向考虑的。
如果刷脏页一定写盘的话,就保证每个数据页有两种状态:
一.内存里存在,内存里肯定是正确的结果,直接返回
二.内存里不存在,就可以肯定文件数据里是正确的结果,读入内存后返回。这样效率最高。

3.mysql认为系统空闲的时候
4.mysql正常关闭的情况

接下来,我们分析一下这四种情况对性能的影响:
第一种:redo log写满要flush脏页。这种情况innodb要尽量避免,因为出现这种情况的时候,整个系统就不能再接受更新了,所有更新都必须要堵住。
第二种:内存不够用,要先将脏页写到磁盘上,这种情况其实是常态。InnoDB(buffer pool)管理内存,缓冲池中的内存其实有三种状态。
第一种:还没有使用的
第二种:使用了并且是干净页
第三种:使用了并且是脏页
innodb的策略是尽量使用内存,因此对一个长时间使用的库来说,未被使用的页面很少。
而当要读入数据页没有内存的时候,就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉,如果淘汰的是一个干净页,就直接释放复用;但如果是脏页就直接将脏页先刷到磁盘,变成干净页再复用。
所以,刷脏页虽然是常态,但是出现这两种状况都会明显影响性能:
1.一个查询要淘汰的脏页太多,会导致查询的响应时间明显变长
2.日志写满,更新全部堵住,写性能跌为0,这种情况对敏感业务来说,是不能接受的。

Innodb的策略是尽量使用内存,因此对于一个长时间运行的库来说,未被使用的页面很少
而当读入的数据页没有内存的时候,就必须到缓冲池中申请一个数据页。这时候只有把最久不使用的数据页淘汰掉:如果要淘汰的是一个干净页,就直接释放出来复用;但如果是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。

所以刷脏页虽然是常态,但是出现以下两种情况都会明显影响性能:
1.一个查询要淘汰的脏页太多,会导致查询的响应时常明显变长
2.日志写满,更新全部堵住。
所以我们需要有控制脏页比例的机制。

InnoDB刷脏页的控制策略
接下来,我们和你说说innoDB脏页的控制策略,以及和这些策略相关的参数。
首先,你需要正确的告诉所在主机的io能力,这样innoDB才知道全力刷脏页的时候,可以刷多快。
这就要用到innodb_io_capacity这个参数了,它会告诉InnoDB你的磁盘能力。这个值我建议你设置成磁盘的IOPS。

例子:MySQL写入很慢,TPS很低,但是数据库主机的io压力并不高。经过一番排查之后,发现罪魁祸首就是这个参数的问题。他的主机磁盘用的是SSD,但是innodb_io_capacity的值设置的是300。于是,innoDB认为这个系统的能力就这么差,所以刷脏页就这么慢,甚至比脏页的生成速度还慢,这样就造成脏页累积,影响查询和更新的性能。

InnoDB的刷盘速度就是要参考这两个因素:一个是脏页比例,一个是redo log写盘速度。
在InnoDB中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为1的时候会有上述的“连坐”机制,值为0时表示不找邻居,自己刷自己的。
在MySQL 8.0中,innodb_flush_neighbors参数的默认值已经是0了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值