• 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树呢(有知道的可以评论区解答下)。

  • 相关阅读:
    JavaScript数组常用的方法整理
    浏览器——Microsoft Edge
    华为设备配置中型网络WLAN基本业务
    redis 登录客户端命令
    空间数据索引的利器:R-Tree原理与实现深度解析
    uniApp组件如何使用笔记
    Linux_7_软件管理
    设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)
    minio文件服务器开启https
    【通用设计方法】之接收异常保护
  • 原文地址:https://blog.csdn.net/qq_41820066/article/details/127561093