mysql之刷脏页

前言

数据页相比大家都不默认,之前介绍mysql的时候,给大家说过,读数据都是从内存中读取的。而数据库中的表以什么形式存在内存中呢,就是数据页的形式。

sql为什么会变慢

不知道大家有没有遇到这种情况,之前都是好好的,突然就变慢了。这种情况可能就是数据库正在刷脏页。什么是脏页呢。就是如果内存的数据和磁盘的一样。我们称只为干净页。但是如果内存数据和磁盘不一致,我们称之为脏页。为什么会出现脏页呢(直接介绍过,就是你的操作都是写到内存里的,然后就会出现脏页)。

刷脏页的几种情况

1.就是redo log满的时候,数据库会刷一部分脏页到磁盘上,同时消除一部分redo log日志
2.还有就是内存满的时候,你想申请数据页,但是已经没有空间了。
3.就是数据库空闲的时候
4.就是数据库服务关闭的时候
后两种不用说了,是不会影响性能的,只有前两种会影响性能。那么怎么解决呢。参考下面的解决方案
设置innodb_io_capacity参数,这个就是刷脏页的参数。这个参数设置需要参考你计算机的能力。
然后innodb_max_dirty_pages_pct根据这个脏页比例,通过一定的算法算出一个树x,然后根据正在写入的redo log日志序号,和checkpoint之间的差值n,算出另一个值y,然后取xy之间的最大值r,然后根据计算的配置,确定刷脏页的最大速度,乘以R%,设置为刷脏页的速度。

刷脏页的连坐制

连坐是不是听起来像古代的诛九族。事实上差不多。就是刷脏页的时候,如果这个脏页相邻的数据页也是脏页,就会一起给刷了。innodb_flush_neighbors这个参数就是控制这个连坐制的,1代表连坐。0代表只刷自己的。
这个主要是机械键盘时代,随机读取很消耗性能,所有才有这个设置。而如果使用的是 SSD 这类 IOPS 比较高的设备的话,我就建议你把 innodb_flush_neighbors 的值设置成 0。因为这时候 IOPS 往往不是瓶颈。

总结

突然出现的操作数据库很慢,很有可能就是正在刷脏页。这个时候你就需要考虑怎么合理的设置这个刷脏页的速度。然后其实我有个疑惑。既然 SSD 这类 IOPS 比较高的设备随机读取不是性能的瓶颈,那么是不是意味这个b+树可以换成b树呢(有知道的可以评论区解答下)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark---小鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值