MySQL45讲之InnoDB刷脏策略 – flowers「建议收藏」

MySQL45讲之InnoDB刷脏策略 – flowers「建议收藏」本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。

MySQL45讲之InnoDB刷脏策略 - flowers

前言

本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。

意义

了解 MySQL 的刷脏策略有什么意义?

当一条正确的 SQL 执行时偶尔延迟较高,无法复现场景时,可能就是 MySQL 刷脏导致的。通过了解 MySQL 的刷脏策略,可以帮助我们更好地使用 MySQL 及调优。

刷脏控制策略

innodb_io_capacity

innodb_io_capacity 变量告诉 MySQL 主机磁盘的 IO 性能,这样 InnoDB 就知道全力刷脏的时候,可以刷多快。

innodb_io_capacity_max 表示刷脏速度的最大值,默认是 200。

控制策略

InnoDB 知道了它刷脏的上限后,还需要确定它刷脏速度的控制策略,因为它不可能将所有 IO 都用于刷脏,还需要处理用户的查询请求。

控制策略关注两点,一是内存中脏页的占比,一是 redo log 的写入速率。

1、innodb_max_dirty_pages_pct 是脏页的占比上限,默认是 75%。InnoDB 会根据脏页的比例(假设为 M),计算出一个 0 ~ 100 的值,假设为 p1,计算逻辑如下:

F1(M)
{
  if M>=innodb_max_dirty_pages_pct then
      return 100;
  return 100*M/innodb_max_dirty_pages_pct;
}

2、InnoDB 每次写 redo log 日志都会记录一个序号,当每新写入一条记录时,会计算当前这条日志的序号减去 checkpoint 记录序号的差值,InnoDB 再将这个差值应用于计算算法得到一个 0 ~ 100 的值,假设为 p2。该计算算法比较复杂,可以确定地逻辑是,当差值越大得到地结果越大。

3、取 p1 和 p2 之间的较大值 R,之后引擎的刷脏速率就是 R% * innodb_io_capacity。

邻居顺带刷脏策略

执行 SQL 时,刷脏会让语句执行变慢,而邻居顺带刷脏策略会让执行变得更慢。

当进行一次刷脏时,如果脏页的旁边的数据页也是脏页,那就会准备把这个邻居脏页也进行刷脏,并且将邻居刷脏的逻辑还可以蔓延,使得将相邻的脏页都刷脏。

该策略对于早期机械硬盘 IOPS 低是很有帮助的,可以减少很多随机 IO。但在当前 IOPS 较高的 SSD 磁盘下,这个策略显得鸡肋且有副作用。

所以,建议将该策略禁用,即设置 innodb_flush_neighbors = 0,MySQL8 默认是禁用该策略的。

参考

  • [1] 为什么我的MySQL会“抖”一下

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

(0)
上一篇 2023-04-22
下一篇 2023-04-22

相关推荐

  • impala使用教程_impala优化

    impala使用教程_impala优化###什么是Impala 用来处理存储在Hadoop集群中大量数据的大规模并行处理的sql查询引擎,它是由C++和Java编写的开源软件,它提供了访问Hadoop中分布式文件系统中的数据的最快的方法。

    2023-05-09
    136
  • Python List:高效处理数据的利器

    Python List:高效处理数据的利器在Python中,列表(List)是一种非常常用的数据结构,它可以用来存储一系列有序的元素。与字符串不同,列表中的元素可以是不同类型的,例如有整数、浮点数、字符串等等。在处理数据方面,列表的应用非常广泛,例如数据预处理、数据清洗、数据分析等等。本文将从多个方面阐述Python列表的使用方法和技巧,为大家介绍Python List这个高效处理数据的利器。

    2023-12-04
    113
  • Python工程师技能要求

    Python工程师技能要求在当前的软件开发行业中,Python已经成为了最热门的语言之一。Python与其它语言相比,具有易读易学的特点,并且拥有非常丰富的库和工具可以使用。在这篇文章中,我们将会介绍Python工程师的技能要求。

    2024-06-15
    65
  • 全量同步和增量同步_es多个索引关联查询

    全量同步和增量同步_es多个索引关联查询MySQLmom同步MySQL到es

    2023-04-20
    148
  • MongoDB 如何实现嵌套子文档分组「建议收藏」

    MongoDB 如何实现嵌套子文档分组「建议收藏」MongoDB 嵌套结构的数据非常常见, 它通过嵌套子文档,达到一对多的关联关系。但嵌套结构中按分类分组求子文档的数据计算,不能直接通过 $group 聚集运算来实现,需要将嵌套结构解开,由多层嵌套…

    2023-03-05
    151
  • MySQL第七天[亲测有效]

    MySQL第七天[亲测有效]2022-09-09 1、左连接查询(left join) 查询条件的一种,以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在null值填充。 以“students表(id,name,ag

    2023-06-04
    149
  • cdh安装flink_hadoop为什么要编译源码

    cdh安装flink_hadoop为什么要编译源码准备工作 因为在编译时需要下载许多依赖包,在执行编译前最好先配置下代理仓库 编译flink shaded 因为flink依赖flink shaded工程,基本的依赖项都是在这个工程里面定义的,所以要先

    2023-01-23
    155
  • 优化Python代码性能的有效方法——编写C扩展

    优化Python代码性能的有效方法——编写C扩展Python是C语言编写的一个解释器,其解释运行速度较慢,特别是在执行大量计算及频繁调用函数时,性能表现更加低下。为了提高Python程序的性能,我们可以采用多种方法,其中一个重要的方式便是编写C扩展。C扩展是指使用C语言编写Python模块,然后将其作为Python模块来调用和使用。下面从多个方面阐述如何通过编写C扩展来提高Python程序的性能。

    2024-02-15
    88

发表回复

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