《MySQL45讲》读书笔记(三):内存数据刷盘机制

《MySQL45讲》读书笔记(三):内存数据刷盘机制此文为极客时间:MySQL实战45讲的12节的学习笔记一、mysql的刷盘机制而之前提到过,mysql使用了WAL技术,即更新的时候先更新内存中的数据,然后必要的时候再将内存中的数据刷入磁

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

此文为极客时间:MySQL实战45讲的12节的学习笔记

一、mysql 的刷盘机制

而之前提到过,mysql 使用了 WAL 技术,即更新的时候先更新内存中的数据,然后必要的时候再将内存中的数据刷入磁盘。我们把内存中这些被修改过,跟磁盘中的数据页不一致的数据页称为脏页。

其中,有四种情况会触发脏页的刷盘:

  1. redo log 可写空间满了。
  2. 内存满了,需要淘汰的数据页恰好是脏页。
  3. 系统不繁忙的时候。
  4. 关闭数据库的时候。

其中,第三种情况不会为系统带来过多影响的,第四中情况下不会在乎为系统带来的影响。所以我们只需要关注第一和第二种情况:

对于第二种情况,由于 mysql 的更新需要先写日志,所以当日志满了的情况下,所有的更新都会停止,一直到刷完盘日志腾出了空间为止

而对于第二种情况,当查询的数据在内存中的数据页没有的时候,就需要淘汰旧页释放内存以读入新页,所以当一次查询导致需要淘汰的脏页过多的时候,就需要先等待较长的刷盘时间,然后才能获取响应

为了避免上述两种情况,必须要控制脏页在内存中的比例。

二、刷脏页的控制策略

首先,我们必须要知道主机磁盘的写入能力有多强,这样 innodb 才可以知道它刷脏页的速度最快应该是多快。

我们可以通过设置 innodb_io_capacity 这个参数来告诉 innodb 磁盘的写入速度。这个参数的值不宜过小,因为这会导致 innodb 错误的估计刷盘速度,最后导致刷脏页的速度跟不上脏页生成的速度。

innodb_io_capacity规定了刷脏页速度的极限,但是实际上磁盘不可能只服务这么一个功能,所以还需要参考 redo log 的刷盘速度允许的内存中的脏页比例。

参数 innodb_max_dirty_pages_pct 是脏页比例上限,默认值是 75%。innodb 会根据当前的脏页比例(假设为 M),算出一个范围在 0 到 100 之间的数字,这个公式是 F1(M)

而每次写入 redo log 的写入点 wp 都会有一个序号,innodb 会根据这个序号和上一次清理日志的界限 cp 之间的差值——我们假设为 N——计算得到一个范围在 0 到 100 之间的数字,这个公式是 F2(N)

根据上述算得的 F1(M)F2(N) 两个值,取其中较大的值记为 R,之后引擎就可以按照 innodb_io_capacity 定义的能力乘以 R% 来控制刷脏页的速度。

这一整个流程对应的图片是这样的:

image-20201029164736099

所以,我们需要关注内存中的脏页比例,让它尽量不要到75%,并且合理的设置 innodb_io_capacity 参数。

其中,针对脏页的比例,我们可以通过 Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total去设置。

另外,由于 mysql 存在这样一个机制:如果要刷盘的脏页相邻的数据页恰好也是脏页,就一起写入磁盘,如果邻居的邻居也是如此。在机械硬盘时代这个策略可以减少随机IO,但是如果使用固态硬盘的话随机IO的性能往往比较高,所以使用这个策略反而拖累了查询性能。因此可以通过 innodb_flush_neighbors关闭这个“连坐”的策略。

三、总结

innodb 有四种情况会触发脏页的刷盘:

  • redo log 可写空间满了;
  • 内存满了,需要淘汰的数据页恰好是脏页;
  • 系统不繁忙的时候;
  • 关闭数据库的时候。

innodb 通过的刷盘速度通过类似这样的公式计算:

innodb_io_capacity * Max( F(innodb_max_dirty_pages_pct), F(redo log的wp - redo log的cp) )

其中,innodb_io_capacity表示磁盘的最大IO能力;innodb_max_dirty_pages_pct表示允许脏页在内存中的占比,默认值为75%;

当使用固态硬盘的时候,可以设置innodb_flush_neighbors关闭默认的刷新相邻脏页的策略。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170785.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月16日 下午10:46
下一篇 2022年8月16日 下午10:46


相关推荐

  • Hbase 实战 4.1 点滴

    Hbase 实战 4.1 点滴4 1 4Targeteddat Puttingdatai nbsp valueoccupie nbsp ortherowkey Butyoucanpos

    2026年3月17日
    2
  • 百度文心一言API4.0 Python调用ERNIE-4.0-8K全流程详解

    百度文心一言API4.0 Python调用ERNIE-4.0-8K全流程详解

    2026年3月12日
    2
  • mysql数据库置疑_SQL数据库置疑 823 824 错误修复 无法附加处理

    mysql数据库置疑_SQL数据库置疑 823 824 错误修复 无法附加处理SQL数据库为什么会置疑?这个原因有很多,例如阵列崩溃导致数据库文件页面损坏,病毒破坏,分区损坏。断电非法关机等因素怎样防止数据库置疑?远程备份或者备份到本机另一块硬盘是最佳方式,平时要多注意预防病毒文件系统检查(chkdsk检测分区看看有无坏道或者文件系统问题)UPS电源检测没事的时候就行DBCCCHECKDB检测再小的故障都要立即解决,数据库不可以带故障运行。出现故障恢复方案?…

    2022年8月20日
    8
  • portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程

    portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程Portraiture3forMac是PS中优秀的人像磨皮滤镜插件,portraiture3mac激活成功教程版可以对皮肤、头发、眉毛、睫毛等部位进行磨皮润色处理,还能自由调整锐度、柔软度、亮度、对比度等,这里为大家带来portraiture滤镜的激活成功教程教程,赶紧来看看吧!portraiture激活成功教程步骤下载好Portraiture安装包后,点击打开Portraiture.dmg,双击【…

    2022年7月22日
    15
  • c语言qq密码程序设计,【转】C语言实现QQ密码大盗

    c语言qq密码程序设计,【转】C语言实现QQ密码大盗该楼层疑似违规已被系统折叠隐藏此楼查看此楼【转】C语言实现QQ密码大盗一般的盗密码的软件的软件都是通过监视键盘来获得密码,这样操作比较方便,但是这样也存在一定问题,密码有的时候不是很准确,因为有的人输入密码并不是从前到后输入,当然这样的人也是少数,盗密码嘛,当然去得到那些比较粗心的人的密码!通过安装钩子来监视QQ登陆界面就是获得密码的方法,在安装前得先找到登陆窗口的句柄,当钩子安装后,记录键盘…

    2022年7月20日
    20
  • Python环境配置及项目建立

    Python环境配置及项目建立一、安装PythonPython比较稳定的两个版本是Python3.5和Python2.7,我用的是Python2.7,下载地址是:https://www.python.org/downloa

    2022年7月5日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号