【MySQL】聊聊脏页flush的原理和控制策略

news2024/10/6 6:44:49

flush的时机

当更新一条SQL的时候,其实是先写undo日志,然后更新数据,二阶段写入redo 和 bin log。对于更新数据,其实是只修改了changer buffer中的数据,比如将name = qxlxi, 但是磁盘数据页没有和内存页数据保持一致。

内存页和磁盘数据页内容不一致时为脏页,内存数据写入磁盘后,内存和磁盘上数据页一致时为干净页。

那么有几种时机会进行flush。

1.redo log写满

当redo log写满后,就会开始将数据写入磁盘中。如图所示,会先将cp到cp’的数据刷新到磁盘中,然后继续写redo log。
在这里插入图片描述

2.系统内存不足

当系统内存不足时,会淘汰一批数据页,如果淘汰的是脏页,那么先将脏页写入到磁盘中。

3.MySQL空闲

mysql空闲的时候,就会处理脏页数据的同步

4.mysql正常关闭

mysql正常关闭,将内存的脏页flush到磁盘上。下次启动直接从磁盘上读取数据,启动数据快。

好了,来分析下,对于mysql空闲和关闭进行flush其实是正常,redo log写满场景其实需要避免,出现这种情况,其实所有更新必须堵住,更新数为0。
第二种内存不够用,其实InnoDB用缓冲池管理内存,缓冲池中的内存有三种状态。

  • 没有使用、使用了是干净页、使用了是脏页。

当读入的数据页没有在内存的时候,就会申请从缓冲池中申请一块数据页,根据LRU算法将内存页淘汰,如果是干净页可以直接复用,如果时脏页,需要先将脏页刷到磁盘,然后变成干净页才能使用。

所以总结下:
1.一个查询如果淘汰的脏页个数太多,就会导致查询的响应时间变长,(涉及flush刷盘)
2.日志写满,更新全部堵住,写性能跌为0。

InnoDB需要控制脏页比例的机制,来避免上面的两种情况。

InnoDB 刷脏页的控制策略

sql innodb_io_capacity
告诉InnoDB所在主机的IO能力,InnoDB才知道需要权利刷脏页的时候,可以刷多块,通过这个参数决定,通常设置成磁盘的 IOPS。

决定InnoDB刷盘速度的两个因素,一个是脏页比例,另外就是redo log写盘速度。

sql innodb_io_capacity
不要接近75%

当一个查询请求执行的时候,需要flush一个脏页,而这个脏页flush的时候,旁边的也是脏页,那么就会跟着刷新。bashinnodb_flush_neighbors可以决定是否启用连坐机制。1是,0否。如果时机械硬盘建议设置为0,SSD则可以采用1,8.0目前采用0.

小结

WAL机制,其实就是为了避免随机写入,而采用追加日志的方式,先写入redo log。然后异步刷盘的操作。提升数据库的性能,但是也引入了脏页的问题,脏页flush会占用资源从而影响更新和查询语句的响应时间。所以掌握flush的刷新时机,已经相关的策略配置是非常重要的。

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

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

相关文章

删除指定目录

题目描述 我们定义一种目录结构字符串(类似Windows的 tree /f 的输出内容),用它来表达目录树的结构,如图所示: 目录结构字符串的输入仅含数字、字母和|-,其中:|- 表示子目录的层次符号;字母或数字组成目录名(字母大小写敏感)。 某一子目录挂接在其前面、最近的上一层…

【Linux系统编程】进程概念、进程排队、进程标识符、进程状态

目录 什么是进程? 浅谈进程排队 简述进程属性 进程属性之进程标识符 进程操作之进程创建 初识fork fork返回值 原理角度理解fork fork的应用 进程属性之进程状态 再谈进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux下的进程状态 “R”(运行状…

【Go专家编程——内存管理——垃圾回收】

垃圾回收 所谓的垃圾就上不在需要的内存块,垃圾如果不清理,这些内存块就没有办法再次被分配使用。在不支持垃圾回收的编程语言中,这些垃圾内存就上泄露的内存。 1. 垃圾回收算法 常见的垃圾回收算法有3种 引用计数:对每个对象…

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端?

SpringCloud的Config配置中心,为什么要分Server服务端和Client客户端? 在SpringCloud的Config配置中心中分了Server服务端和Client客户端,为什么需要这样分呢?它的思想是所有微服务的配置文件都放到git远程服务器上,让…

使用FFmpeg推流实现在B站24小时点歌直播

使用FFmpeg推流实现在B站24小时点歌直播 本文首发于个人博客 安装FFmpeg centos7 https://www.myfreax.com/how-to-install-ffmpeg-on-centos-7/ https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/ 使用FFmpeg在B站直播 https://zhuanlan.zhihu.com/p/2395…

机器学习(五) -- 监督学习(5) -- 线性回归1

系列文章目录及链接 上篇:机器学习(五) -- 监督学习(4) -- 集成学习方法 - 随机森林 下篇:机器学习(五) -- 监督学习(5) -- 线性回归2 前言 tips&#xff1…

Redis教程(十五):Redis的哨兵模式搭建

一、搭建Redis一主二从 分别复制三份Redis工作文件夹,里面内容一致 接着修改7002的配置文件,【redis.windows-service.conf】 port 7002 改成 port 7002 slaveof 127.0.0.1 7001 7003也同样修改 port 7003 slaveof 127.0.0.1 7001 这样就指定了700…

B站滑块登录之极验点选

滑块登录这些东西都不是很难,我个人的去处理的话一般会考虑三种方案,一个是自动化selenium 二是各类打码平台 三是ocr识别,本文是selenium接打码平台,也是个比较常规的操作。 先常规步骤跟着来吧,做登录的话把基本的模…

【启程Golang之旅】运算符与流程控制讲解

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…

【qt】标准型模型 下

标准型模型 一.前言二.预览数据1.获取表头2.获取数据项 三.保存文件1.文件对话框获取保存文件名2.用文件名初始化文件对象3.打开文件对象4.用文件对象初始化文本流5.写入数据 四.格式1.居右2.居中3.居左4.粗体 五.模型的信号1.解决粗体action问题2.状态栏显示信息 六.总结 一.前…

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 什么是搜索引…

NTFS文件系统文件寻址实操记录

前言 最近在学NTFS,发现网上的博客千篇一律,讲的不够通透,于是决定自己写一篇。 本文章通过寻找文件地址这个任务,讲述了NTFS文件系统$Boot文件、$MFT文件的结构,对$MFT文件中的A0、80属性进行了重点分析。 本文对于…

k8s-pod详解

一、Pod基本概念: 1.pod介绍: Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如&am…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist(语言家)步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言,得到.ts后缀的翻译文件 3.创建.pro文件,并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件,按图所示…

python中的条件语句

python中语句的执行顺序 默认情况下,python代码的执行顺序,是从上到下依次执行的,这个顺序是不会变的, python中的条件语句 电脑的CPU芯片是能够进行算术运算也能进行逻辑判断的。 条件语句能够表达“如果...否则...” 这样的语…

P451 try-Catch异常处理

//基本使用演示代码 public static void main(String[] args) { int num1 10; int num2 0; try { int res num1 / num2; }catch (Exception e) { System.out.println(e.getMessage()); } } public class TryCatchDetail { public static void main(String[] args) { //1. 如…

dubbo复习:(8)使用sentinel对服务进行降级

一、下载sentinel-dashboard控制台应用并在8080端口启动 二、项目添加springboot 和dubbo相关依赖(降级规则并未持久化,如果需要持久化,如果需要持久化降级规则,只需增加nacos相关依赖并在nacos中进行配置,然后配置app…

pyside6下没有designer.exe、pyside6-uic.exe等

使用conda安装的pyside6(conda install pyside6),发现pyside6目录下没有designer.exe、pyside6-uic.exe等;designer.exe在Miniconda3/Library/bin下 pyside6-uic.exe、pyside6-rcc.exe在Miniconda3\Scripts下 但是 使用pip安装…

前端nvm、nodejs、npm、cnpm、yarn安装教程(超详细图文,含卸载旧的nodejs,安装及环境变量配置)

最近换了新电脑,一开始在网上找了一个教程让下载nvm-noinstall.zip 压缩包解压使用,踩坑了,过程复杂最后报错无法用。 后来搜到下文教程,直接使用nvm。exe进行安装,方便快捷。下面这个文章写的很详细,从如何…

Spark搭建 Standalone模式详细步骤

Standalone模式概述: Standalone模式是Spark自带的一种集群模式(本地集群,不依赖与外部集群,比如Yarn),可以真实地在多个机器之间搭建Spark集群的环境。 Standalone是完整的Spark运行环境,其中: Master角…