为什么mysql有时候会不稳定

内存数据页和磁盘数据页内容不一致的时候,这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。不论是脏页还是干净页,都在内存中。

平时的更新操作就是写内存和日志,mysql突然变慢的那个瞬间可能就是在刷脏页(flush)。

一、什么时候会引发flush过程:

1. InnoDB的redo log写满了。这时系统会停止更新操作,把一部分日志flush到磁盘上。之后就可以继续写入日志。

2. 系统内存不足,当需要更新内存页的时候,内存不够用,需要淘汰一些数据页,如果淘汰的是脏页,就需要先将脏页写到磁盘。

3. Mysql认为系统空闲的时候把redo log里面的操作记录到磁盘中,为了提高效率,mysql有空就会刷脏页

4. Mysql正常关闭的情况下,会把内存的脏页都flush到磁盘上,下次Mysql启动的时候就可以直接从磁盘上读数据。

二、这四种场景对性能的影响:

第三种是mysql空闲时候的操作,这时系统没什么压力;

第四种是数据库关闭的时候,也不需要关注性能问题。

第一种是redo log 写满了,InnoDB要尽量避免这种情况,因为出现这种情况,整个系统就不能再更新了。

第二种是内存不够用了,这种情况是常态,InnoDB用缓冲池管理内存,缓冲池中内存页有三种状态:1.没有使用;2.使用了是干净页;3.使用了是脏页;InnoDB的策略是尽量使用内存,因此对一个长时间使用的库来说,未被使用的页面很少。当要读入的数据页没有在内存的时候,就需要到缓冲池种申请一个数据页,这时候是把最久不用的数据页从内存中淘汰掉:如果淘汰的是一个干净页,就直接释放出来复用,如果是脏页,就需要先将脏页刷到磁盘,变成干净页才能复用。如果出现以下两种情况会明显影响性能:

1. 一个查询需要淘汰的脏页个数太多

2. 日志写满,写性能为0

三、InnoDB刷脏页的控制策略:

1.设置innodb_io_capacity参数,是告诉InnoDB你的磁盘能力。InnoDB 的刷盘速度就是要参考这两个因素:一个是脏页比例,一个是 redo log 写磁盘的速度。合理地设置 innodb_io_capacity 的值,并且平时要多关注脏页比例,不要让它经常接近 75%。

2.一个查询请求需要在执行过程中先 flush 掉一个脏页时,这个查询就可能要比平时慢了。而 MySQL 中的一个机制,可能让你的查询会更慢:在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉;而且这个把“邻居”拖下水的逻辑还可以继续蔓延,也就是对于每个邻居数据页,如果跟它相邻的数据页也还是脏页的话,也会被放到一起刷。在 InnoDB 中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为 1 的时候会有上述的“连坐”机制,值为 0 时表示不找邻居,自己刷自己的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值