mysql 性能优化——磁盘刷脏页性能优化

前言

大家是不是感觉mysql 更新挺快的呀,有没有想过mysql 更新为什么那么快。按道理说,mysql 更新都是先找到这一行数据,然后在去更新。意味着,就有两次磁盘操作,一个是磁盘读,一个是磁盘写。如果真的是这样的话,肯定会很慢呀,mysql 也没有那么傻。

当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面 。这个过程就是flush,flush 就是把内存里的数据写入到磁盘的过程。

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。也可以这么说,内存的数据一定是最新的。那什么时候数据会flush呢。

数据库的flush

  1. redo log 已经写满了,每个更新操作,都会在 redo log 记录,这样当mysql 崩溃后,可以用redo log 恢复,这种能力就是crash-safe

  2. 就是系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘,这样就保证了数据页有两种状态。

    1)内存里存在,内存里肯定是正确的结果,直接返回

    2)另一种是内存里没有数据,就可以肯定数据文件上是正确的结果,读入内存后返回。这样的效率最高。

  3. mysql 业务操作不是很繁忙的时候

  4. mysql 正常关闭的时候

关于性能方面,4、3 两点都不会对mysql 性能没有什么影响。下面要着重讲解下1、2两点。 1点是redo log写满了,要flush 脏页,这种情况是要避免的,此时,整个系统就不在更新操作了,必须先刷脏页,只有redo log有空间了,才会继续更新。 第2点是内存不够用了,要先将脏页写到磁盘,这种情况是常态。InnoDB 用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态:1)还没有使用 2)使用了并且是干净页 3)使用了并且是脏页

为了提高系统的性能,Innodb 尽量会使用内存,因此对于一个长时间运行的库来说,未被使用的页面很少。当读入的数据页没有在内存的时候,必须到 buffer pool 申请一个数据页。如果没有数据页了,只能淘汰那些最久没有使用的数据页,淘汰的数据页如果是干净页,直接释放,如果是脏页,就必须把它刷到磁盘,变成干净也才能使用。那mysql 怎么知道是脏页呀,这个就是buffer pool脏页列表,最开始更新的就放在脏页列表,刷盘后,就从脏页列表移除。

刷脏页虽然是mysql 最终必须要做的事情,有些可能会影响mysql 性能

  1. 一个查询淘汰的脏页个数太多,这些脏页必须先merge 操作,会把脏页写到磁盘,会影响性能

  2. redo log 写满后,更新全部堵塞,必须先刷脏页,这种情况对更新频繁的业务来说不能接受的

针对这些情况,innodb 用了一些机制,避免这些情况的发生。

nnoDB 如何控制刷脏页的

根据上面所述,innodb 刷脏页的能力非常重要,能力弱,刷脏页就少,等业务繁忙,很快redo log 写满了,业务更新停摆了。整个能力其实就是配置的,可以看下图:

你要正确地告诉 InnoDB 所在主机的 IO 能力,这样 InnoDB 才能知道需要全力刷脏页的时候,可以刷多快。 这就要用到 innodb_io_capacity 这个参数了,它会告诉 InnoDB 你的磁盘能力。这个值我建议你设置成磁盘的 IOPS。磁盘的 IOPS 可以通过 fio 这个工具来测试,下面的语句是我用来测试磁盘随机读写的命令:

 fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest 

我在测试环境是这样的:

bs=16k 一次读取页的大小,size=1G 写1G的数据,runtime 运行了60s,最终测试得 write IOPS = 37.2k = 37200。此时

innodb_io_capacity = 37200 ,这个就是刷盘能力,要考虑服务的负载,可以稍微低于这个值。

现在我们已经合理设置了刷脏页的能力,那么它的刷脏页的速度是怎么计算的呢?

InnoDB 的刷盘速度就是要参考这两个因素:一个是脏页比例,一个是 redo log 写盘速度。

那么速度具体是怎么计算的:

show global variables like 'innodb_max_dirty_pages_pct';
  1. 参数 innodb_max_dirty_pages_pct 是脏页比例上限,默认值是 90%。InnoDB 会根据当前的脏页比例(假设为 M),算出一个范围在 0 到 100 之间的数字,是F1(M)

  2. nnoDB 每次写入的日志都有一个序号,当前写入的序号跟 checkpoint 对应的序号之间的差值,我们假设为 N。InnoDB 会根据这个 N 算出一个范围在 0 到 100 之间的数字,这个计算公式可以记为 F2(N)。

  3. Max(F1(M),F2(N)) = R,

  4. innodb_io_capacity*R% = 刷盘数度

上面 F1(M)和F2(N)大家知道有这么回事就行,不必深究,想知道具体算法,只能看源码呢?只要设置合适的 innodb_io_capacity 就可以了。

平时我们要监控脏页的比率,不让接近 innodb_max_dirty_pages_pct 这个值,接近了就要报警,说明开始刷脏页,就会影响更新的性能。

select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;

还有一个参数也需要关注:

show global variables like 'innodb_flush_neighbors';

值为1它旁边的脏页也会被刷到磁盘,会一直刷到不是脏页为止,是个连锁的反应。1 只会刷本来的脏页。

机械硬盘时代是很有意义的,可以减少很多随机 IO。机械硬盘的随机 IOPS 一般只有几百,相同的逻辑操作减少随机 IO 就意味着系统性能的大幅度提升。

使用的是 SSD 这类 IOPS 比较高的设备的话,我就建议你把 innodb_flush_neighbors 的值设置成 0。因为这时候 IOPS 往往不是瓶颈,而“只刷自己”,就能更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。

好了写到这里了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ImportError: cannot import name ‘InterpolationMode‘

InterpolationMode 在图像处理库中通常用于指定图像缩放时的插值方法。插值是一种数学方法,在图像大小变化时用于估算新像素位置的像素值。不同的插值方法会影响缩放后图像的质量和外观。 在你提供的 image_transform 函数中,InterpolationMode.BICUBIC…

工业以太网交换机助力电力综合自动化系统卓越运行

随着电力行业不断迈向数字化和自动化时代,电力综合自动化系统逐渐成为实现电网智能化管理的核心。在这一复杂而庞大的系统中,工业以太网交换机扮演着至关重要的角色,连接着各种智能设备,实现数据的快速传输和高效管理,…

c++ 串口通信库

根据资料整理的串口通信库,封装成为了动态库,使用者只需要调用接口即可 使用实例如下: //接受数据 void CSerialPortCommonLibDemoDlg::OnReceive() { char * str NULL; str new char[256]; _port.readAllData(str); CString s…

【Docker安装教程】CentOS 7 上的 Docker 安装与配置

CentOS 7 上的 Docker 安装与配置 前提条件 一台运行CentOS 7的服务器对CentOS有基本的了解和操作经验root用户或具有sudo权限的用户 安装步骤 1. 更新系统软件包 首先,确保你的系统是最新的。这有助于避免安装过程中的兼容性问题。 sudo yum update -y2. 安装…

基于SpringBoo的火车订票管理系统(程序+文档+数据库)

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一、研究背景…

harmonyos arkts 开发商品页面

1.结果展示 2. 实现分层组件 1.1 实现搜索栏 1.2 代码 这段代码是一个构建搜索框组件的方法,具体功能包括: - 创建一个Search组件,设置初始值为this.keyword,placeholder为请输入书名... - 添加一个搜索按钮,并设置…

【雷达相机外参标定】direct_visual_lidar_calibration安装

direct_visual_lidar_calibration安装 主页安装ubuntupclOpenCVceres其他依赖fmtdirect_visual_lidar_calibration 标定雷达和相机时使用direct_visual_lidar_calibration。 主页 https://github.com/koide3/direct_visual_lidar_calibration?tabreadme-ov-filehttps://koid…

MYX Finance 确认出席 Hack.Summit() 2024 区块链开发者大会

🎉MYX Finance 确认出席 Hack.Summit() 2024 区块链开发者大会🚀 🌟 激动人心的消息!我们非常荣幸地宣布,MYX Finance 将出席由Hack VC主办,AltLayer和Berachain协办,携手Solana、The Graph、Bl…

Linux/Ubuntu/Debian基本命令:光标移动命令

Linux系统真的超级好用,免费,有很多开源且功能强大的软件。尤其是Ubuntu,真的可以拯救十年前的老电脑。从今天开始我将做一个Linux的推广者,推广普及Linux基础。 光标移动命令对于在终端(Terminal)内有效导…

【经管数据-更新】华证ESG评级得分数据(2009-2023年)

一、数据说明 参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG 等级从低到高分别赋值为1至9 二、数据来源:世界银行&am…

SPI读取TLE5012B编码器角度数据_ACM32G103

买到一个带编码器的电机,卖家留出来读取编码器数据的接口有SPI 具体的原理图如下: P2标注的是SPI的接口,其中MISO和MOSI是硬件连接到一起的 使用ACM32G103的硬件SPI2去读取其角度数据 原理大概如下: 1、先发送读取数据的指令&…

.NET高级面试指南专题十六【 装饰器模式介绍,包装对象来包裹原始对象】

装饰器模式(Decorator Pattern)是一种结构型设计模式,用于动态地给对象添加额外的职责,而不改变其原始类的结构。它允许向对象添加行为,而无需生成子类。 实现原理: 装饰器模式通过创建一个包装对象来包裹原…

Mysql命令行客户端

命令行客户端 操作数据库操作数据表 操作数据库 mysql> create database mike charsetutf8; Query OK, 1 row affected (0.01 sec) mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mike …

ARM基础----STM32处理器操作模式

STM32处理器操作模式 Cortex-M处理器操作模式、特权等级和栈指针操作模式栈指针CONTROL寄存器异常压栈时的SP指针 Cortex-A 处理器运行模型寄存器组 Cortex-M处理器操作模式、特权等级和栈指针 操作模式 处理模式:执行中断服务程序等异常处理,处理器具有…

STM32FreeRTOS信号量(STM32cube高效开发)

一、信号量 (一)信号量概括 信号量是操作系统中重要的一部分,信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。 FreeRTOS 提供了多种信号量,按信号量的功能可分为二值信号量、计数型信号量、互斥信…

WPF Interaction

使用 Interaction 里面的方法来将事件映射到ViewModel层 引用命名空间:System.Windows.Interactivity.dll 在xaml界面引用这两种任意一个就行,这两个做的事情是相同的。 xmlns:i"clr-namespace:System.Windows.Interactivity;assemblySystem.Win…

宽度优先搜索算法(BFS)

宽度优先搜索算法(BFS)是什么? 宽度优先搜索算法(BFS)(也称为广度优先搜索)主要运用于树、图和矩阵(这三种可以都归类在图中),用于在图中从起始顶点开始逐层…

uVeiw color 颜色值

此功能为uView内部通过js提供的一些颜色值,可以用于通过js修改元素字体,背景颜色等一些场景,常用于uView的各个组件中。 这些颜色值,挂载在$u对象下的color数组中,关于这些颜色值的具体描述,详见Color 色彩…

指针--2

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.指针运算1.1.指针-整数1.2.指针-指针1.3.指针的关系运算 2.野指针2.1 野指针成因2.2 如何规避野指针 3.assert 断言4.指针的使用和传址调用4.1 strlen的模拟实…

模型训练中数据标注是什么意思?

问题: 模型训练中数据标注是什么意思? 解答 在机器学习和深度学习领域中,数据标注是指对原始的、未经处理的数据(如图像、文本、音频、视频或3D点云)进行人工标记的过程。这个过程为每一份数据赋予一个明确的标签或…