MySQL 表数据多久刷一次盘?
wptr33 2024-11-24 22:27 44 浏览
前言
事情是这样的,在某乎的邀请回答中看到了这个问题:
-
然后当时我没多想就啪一下写下来这样的答案:
这个其实要通过 MySQL 后台线程来刷的,在 Buffer Pool 中被修改的过的 Page(页)都会被标记成脏页,放到一个链表(Flush 链表)里。
然后 MySQL 通过启动后台线程,在满足条件时将 Flush 链表中的脏页刷入磁盘。
满足的条件是:脏页的数量达到了 Buffer Pool 中页数量的 **10%,当然 10% 这个值是可变的,通过配置项 innodb_max_dirty_pages_pct_lwm 来配置的,其默认值为 10%,并且这个值也必须小于另一个配置 innodb_max_dirty_pages_pct 的值(90%**)。
至于启多少个线程,则是由另一个变量 innodb_page_cleaners 来控制的,默认是 4.一般都不会去改这个。
大概就是这样。
但是,后面有兄弟在下面说:”我唔知你喺讲乜“。
后面我回过头去看,当时写的确实有点过于跳跃了,过一段时间再去看有些不是那么连贯,打算重新把这个事情讲清楚。
1. 表数据
我们这篇「短文」讨论的是【MySQL 表数据多久刷一次盘】,从这个标题中我们可以分裂成两个问题:
- 刷什么到磁盘
- 什么时候刷到磁盘
我们分开来讨论。
2. 刷什么到磁盘
看上去有点废话,肯定是将数据刷入磁盘。所以我们更多需要讨论的是【数据是以什么样的形式被刷入磁盘】。
答案是页
对页不太了解的可以去看看之前写的文章:MySQL 页完全指南——浅入深出页的原理
在 InnoDB 中,页是数据被管理的最小的单位。当使用 InnoDB 作为存储引擎的 MySQL 运行时,表中一行一行的数据会被组织在一页一页当中,放在 Buffer Pool 中。
Buffer Pool 可以看另一篇:详细了解 InnoDB 内存结构及其原理
这一页一页的数据,就存放在 Buffer Pool 中。当 DML 语句(也就是 CRUD)语句对表数据进行了变更之后,数据所在的那一页就会被标记为脏页。
InnoDB 会用一个叫【Flush 链表】的结构来存放这些脏页,凡是被放进该链表的页都代表需要刷入磁盘,但不是立即刷入。
和 InnoDB 的其他日志例如 Redo Log 一样,这些日志都是有自己的刷盘策略。例如 Redo Log,其刷盘策略可以用下图来表示:
参数为0,Redo Log 会每隔一秒,写入并且刷入磁盘。
参数为1,Redo Log 会在每次事务提交之后刷入磁盘
参数为2,每次事务提交,都会写到 OS 缓存中去,然后每隔一秒将 OS 缓存中的数据刷入磁盘
而 Flush 链表也有自己的策略。
3. 什么时候刷到磁盘
接上节,策略就是:脏页的数量达到了 Buffer Pool 中页数量的 **10%**,就会触发将 Flush 链表中的脏页刷入磁盘。举个例子,Buffer Pool 中总共有 100 张页,脏页如果达到了 10 页就会启动后台线程,触发刷盘。
当然,【10%】这个数值是可配置的,通过 MySQL 配置项 innodb_max_dirty_pages_pct_lwm 可以进行调整,只是默认值是 10%。但是我们调整的值不能超过某个最大值,这个最大值由 innodb_max_dirty_pages_pct 来指定,默认值为 90%。
换句话说,默认情况,刷盘阈值是 10%,如果需要自定义,则最大值不能超过 90%。
4. 谁来负责刷盘
上个小节已经说过了,会启动线程来专门做这个事情,这个没有什么疑问。我们需要关注的是会启动多少个线程来做这个事。
答案是 4 个,我们也可以通过配置项 innodb_page_cleaners 来更改,但一般都不会去改这个值。
关于这个点就聊到这。
欢迎微信搜索关注【SH的全栈笔记】,如果你觉得这篇文章对你有帮助,还麻烦点个赞,关个注,分个享,留个言。
- 上一篇:一文看懂如何监控mysql数据库连接情况指标
- 下一篇:MySQL连接数管理
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
