MySQL底层概述—3.InnoDB线程模型

news/2024/11/29 21:43:00/文章来源:https://www.cnblogs.com/mjunz/p/18577616

大纲

1.InnoDB的线程模型

2.IO Thread

3.Purge Thread

4.Page Cleaner Thread

5.Master Thread

 

1.InnoDB的线程模型

InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。

 

后台线程的作用一:负责刷新内存池中的数据,保证缓冲池中的内存缓存是最新的数据。

 

后台线程的作用二:将已修改的数据页刷新到磁盘文件,保证发生异常时能恢复到正常状态。

 

2.IO Thread

IO Thread主要用于:读取数据页 + 写入脏页 + 写入日志缓冲 + 写入写缓冲。InnoDB使用了大量的AIO(Async IO)来做读写处理,可以极大提高性能。在InnoDB之前的版本只有4个IO Thread:分别是Read、Write、Insert Buffer和Log Thread。后来版本将Read Thread和Write Thread分别增大到了4个,一共有10个。

mysql> show engine innodb status;
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)

Read Thread负责读操作,将数据从磁盘加载到缓存,4个。Write Thread负责写操作,将缓存脏页刷新到磁盘,4个。Log Thread负责将日志缓冲区内容刷新到磁盘,1个。Insert Buffer Thread负责将写缓冲内容刷新到磁盘,1个。

 

3.Purge Thread

事务提交后,其使用的undo日志将不再需要了,因此需要Purge Thread回收已经分配的undo页。InnoDB支持多个Purge Thread,以便能加快回收undo页,释放内存。

mysql> show variables like '%innodb_purge_threads%';+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_purge_threads | 4     |
+----------------------+-------+
1 row in set (0.01 sec)

 

4.Page Cleaner Thread

Page Cleaner Thread的作用是:刷脏页 + 清理redo log日志文件。也就是将脏数据刷新到磁盘,脏数据刷盘后相应的redo log就可以被覆盖了。既可以同步数据,又能让redo log达到循环使用的目的。

 

其中Page Cleaner Thread会调用Write Thread线程进行处理。

mysql> show variables like '%innodb_page_cleaners%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_page_cleaners | 1     |
+----------------------+-------+

 

5.Master Thread

(1)Master Thread的具体工作

(2)Master Thread的定时处理

 

Master Thread是InnoDB的主线程,负责调度其他各线程,优先级最高。作用是:定时刷脏页 + 回收undo log + 写入redo log + 合并写缓冲。

 

(1)Master Thread的具体工作

一.调用Page Cleaner Thread进行脏页的刷新

二.调用Purge Thread进行undo log的回收

三.调用Log Thread进行redo log的刷新

四.调用Insert Buffer Thread进行合并写缓冲

 

(2)Master Thread的定时处理

Master Thread内部有两个定时处理,分别是每隔1秒和10秒的定时处理。

 

一.每隔1秒的操作

操作1:每秒刷新脏页数据到磁盘,但需要脏页比例达到75%才操作

innodb_io_capacity用来表示IO的吞吐量,默认200。对于刷新到磁盘页的数量,会按照innodb_io_capacity的百分比来控制。从缓冲池刷新脏页时,刷新脏页的数量为innodb_io_capcity。

mysql> show variables like 'innodb_io_capacity';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_io_capacity | 200   |
+--------------------+-------+
1 row in set (0.00 sec)

如果缓冲池中脏页比例大于innodb_max_dirty_pages_pct(默认75%):刷新脏页到磁盘的数量是innodb_io_capacity的值。

mysql> show variables like 'innodb_max_dirty_pages_pct';
+----------------------------+-----------+
| Variable_name              | Value     |
+----------------------------+-----------+
| innodb_max_dirty_pages_pct | 75.000000 |
+----------------------------+-----------+

操作2:每秒合并写缓冲区的数据

其实并不是每秒都会合并写缓冲区数据的。如果前一秒的IO次数小于5,则认为IO压力小,可执行合并插入缓冲操作。

 

操作3:每秒刷新日志缓冲区到磁盘

即使事务没有提交,也会每秒将重做日志缓冲刷新到重做日志文件中。因此可以理解为什么再大再长的事务提交,时间也是很短的。

 

二.每隔10秒的操作

操作1:每10秒刷新脏页数据到磁盘

从缓冲池刷新脏页时,脏页的数量为innodb_io_capcity。

 

操作2:每10秒合并写缓冲区

合并插入缓冲是innodb_io_capacity的5%。

 

操作3:每10秒刷新日志缓冲区

 

操作4:每10秒删除无用的undo页

 

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

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

相关文章

20222427 2024-2025-1 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1 本周学习内容本周学习了有关Web安全的相关知识,复习了一些有关于Web的基础知识,比如:前、后端的定义,以及在前后端各自使用的语言,如:html、css、JS(前端);C/C++、Python、Java、Go、Php(后端)等。学习了有关于数据库攻击的一些基本操作,如:SQL注入…

基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现四

部分功能:实名认证信息数据层Dao、银行卡类型信息数据层Dao、卡种类信息数据层Dao、卡类型信息数据层Dao、卡面值信息数据层Dao一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类…

kafka的搭建与使用

官网下载地址https://kafka.apache.org/downloads1、上传解压tar -zxvf kafka_2.11-1.0.0.tgz -C ../ mv kafka_2.11-1.0.0 kafka-1.0.02、修改环境变量 配置环境变量vim /etc/profileexport KAFKA_HOME=/usr/local/soft/kafka-1.0.0 export PATH=$PATH:$KAFKA_HOME/binsource …

河北公需课代 (可以补)

学时30个,需要联系15689397956

技术框架对MyBatis的入门学习

MyBatis快速入门 在回顾JDBC时,我们已经创建有Maven工程,而且在pom.xml中也已经导入 mysql 依赖包,这里就直接在原有工程上搭建MyBatis环境,以及使用MyBatis来实现JDBC查询user的操作流程。 MyBatis环境搭建 首先,在 Maven 项目的 pom.xml 中添加 MyBatis 的依赖 jar 包 &…

基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)for t=1:Iterstfor i=1:Numif xwoa(i,1)<0xwoa(i,1)=0.1; endif xwoa(i,2)<0xwoa(i,2)=0.001; end%目标函数更新[pa(i)] = f…

安装苹果系统台式电脑如何正确选购装机硬件

结合自己的一些装机经验和网上查阅的相关资料,给大家安利一波 “ 如何正确选配黑苹果硬件 ” 方面的相关知识。文中配置推介表中的配置都是目前在安装黑苹果上比较常见且稳定的机型,并且EFI引导文件都有现成的,在各大资源网站中也比较好找,能帮助你 快速简单的吃上黑苹果。…

JavaWeb知识点总结

JavaWeb知识点总结和学习笔记目录JavaWebjunit黑盒测试白盒测试注解所需jar包反射作用获取Class对象的方式class对象功能应用注解作用预定义的注解自定义注解解析注解动态代理ProxyMaven作用概述仓库maven依赖仓库:IDEA集成Maven高级功能JDBC概念本质快速入门各个对象抽取JDBC工…

电话号码的字母序列

题目描述 输入一个仅包含数字 2-9 的字符串,输出所有它能表示的字母序列。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入 输入一个包含数字 2-9 的字符串,长度不超过6。 输出 按字典序输出所有能表示的字母序列,每行输出一个。 输入样例 23输出…

IDEA-idea设置导航栏字体大小代码编辑区字体大小

一、设置导航栏字体大小 Setting - Appearance & Behavior - Appearance - Use custom font二、设置代码编辑区字体大小 Setting - Font - Size

Pycharm-Pycharm设置左侧导航栏字体大小和代码编辑区字体大小

一、左侧导航栏字体大小 Setting - Appearance & Behavior - Appearance - Use custom font - Size二、代码编辑区字体大小