当前位置: 首页 > article >正文

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

大纲

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.kler.cn/a/411521.html

相关文章:

  • 自由学习记录(25)
  • 【湿度数据处理】中国地面气候资料日值数据集(V3.0)(MATLAB全代码)
  • esp32触发相机
  • 如何选择黑白相机和彩色相机
  • 滑动窗口篇——如行云流水般的高效解法与智能之道(2)
  • 【Flutter】搭建Flutter开发环境,安卓开发
  • godot游戏引擎_瓦片集和瓦片地图介绍
  • Python开源项目月排行 2024年10月
  • thinkphp日志记录到文件
  • 【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)
  • Oracle RAC 环境下数据文件误建在本地目录的处理过程
  • TCP/IP网络编程-C++(上)
  • C++设计模式之组合模式在解决层次性问题中的好处
  • 基于Kubernetes编排部署EFK日志收集系统
  • 项目二:m序列的设计与实现(FPGA)
  • C++ 中的多继承
  • 【044】基于51单片机数码管时钟【Proteus仿真+Keil程序+报告+原理图】
  • PyQt5控件QWebEngineView(WebView)
  • yolov11剪枝
  • Hive-定时清理无用的临时表
  • Ajax局部刷新,异步请求
  • Java Map
  • 使用ElementUI中的el-table制作可编辑的表格
  • 做好技术文档的几大要素(按过往经验整理)
  • 二,[ACTF2020 新生赛]Include1感谢 Y1ng 师傅供题。
  • webrtc支持h265