0%

MySql——脏页刷新

为什么你的Sql语句变慢了?

  • 当内存数据页和磁盘数据页内容不一致的时候,称这个内存页为脏页。

  • 内存数据写入到磁盘后,内存和磁盘上的数据页内容就一致了,称为干净页。

  • 而将脏页的数据写入到磁盘的过程叫做flush。平时执行很快的更新操作,其实就是在写内存和日志,而MySql偶尔执行语句时变慢,是有可能在刷脏页。

  • 以下有四种情况InnoDB会进行刷脏页:

    1. redolog写满了,记不下了。这时候系统会停止所有更新操作,把checkpoint往前推进,让redolog可以留出空间继续写,而往前推进的过程中就需要把对应的没有写入磁盘的脏页写到磁盘中去。

      img

    2. 当需要新的内存页,而内存不够用时,就需要淘汰掉一些数据页,空出内存给别的数据页使用,如果淘汰点的是脏页,就要先将脏页写到磁盘。

    3. 当MySql认为系统空闲时,就会去刷脏页,当然当系统不空闲时,也会在零碎的空闲片段去刷脏页。

    4. 当MySql正常关闭时,MySql就会把内存中的脏页flush到磁盘上。

InnoDB刷脏页的控制策略

  • 需要告诉InnoDB所在主机的IO能力,可以设置innodb_io_capacity这个参数,一般都是IOPS的值

  • 可以设置innodb_max_dirty_pages_pct的值M,它表示了脏页占内存的最大比例,默认是75%。

  • 而对于redolog,InnoDB每次写入日志都有一个序号,当前写入的序号和cp对应序号之间的差值为N,利用N算出一个比例,它表示了redolog所能写入内容的最大比例。

  • 然后在M和N中去较大值R,以innodb_io_capacity的值乘以R%来控制刷脏页的速度。

    img

-------------本文结束感谢您的阅读-------------