首页 > 数据库 >MySQL底层概述—3.InnoDB线程模型

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

时间:2024-11-29 21:43:49浏览次数:13  
标签:线程 Thread thread 刷新 state InnoDB MySQL 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页

 

标签:线程,Thread,thread,刷新,state,InnoDB,MySQL,innodb,脏页
From: https://www.cnblogs.com/mjunz/p/18577616

相关文章

  • 基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现四
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类商品(如游戏点卡、话费充值卡、礼品卡等)作为数字商品的一种,因其便捷性和即时性,在市场中占据了重要地位。然而,传统的点卡销售方式往往存在渠......
  • 基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现三
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类商品(如游戏点卡、话费充值卡、礼品卡等)作为数字商品的一种,因其便捷性和即时性,在市场中占据了重要地位。然而,传统的点卡销售方式往往存在渠......
  • Z2400038 Java+Mysql+ssm+layui+freemarker的学生成绩管理系统的设计与实现(源代码 PPT
    学生成绩管理系统1.项目描述2.运行环境3.项目技术4.界面展示5.源码获取1.项目描述SSM+Layui+Freemarker学生成绩管理系统项目概述本项目旨在开发一个基于SSM(Spring+SpringMVC+MyBatis)框架的学生成绩管理系统,结合了Layui前端框架和Freemarker模板引擎,为用......
  • Y20030016 基于PHP+MySQL的网上鲜花销售系统商城网站的设计与实现 源码 PPT 论文
    鲜花销售商城系统1.摘要2.开的发背景和意义3.项目功能结构4.界面展示5.源码获取1.摘要在互联网迅速发展的今天,网上购物已经是人们日常生活所不可缺少的消费渠渠道,人们日常生活基本已完全被网络所覆盖,互联网影响到各行各业,同时也为各大商家或企业提供了一个很好的......
  • Spring-线程池执行save语句报错“ No SecurityManager accessible to the calling cod
    报错信息:Cause:org.apache.shiro.UnavailableSecurityManagerException:NoSecurityManageraccessibletothecallingcode,eitherboundtotheorg.apache.shiro.util.ThreadContextorasavmstaticsingleton.Thisisaninvalidapplicationconfiguration.ator......
  • win10 ==>一步步 执行 mysql8 + jdk21 + maven 安装即配置
    ============================= mysql8 ================================================官网:https://dev.mysql.com/downloads/mysql/选择版本为8+ LTS版本 下载ZIP压缩包  如下图 点击download后,不用登录 点击  Nothanks,juststartmydownloa......
  • MySQL数据库表的操作
    1、总述今天我跟大家分享MySQL数据库中表的创建,查看,修改,删除。2、创建表createtabletable_name(        field1datatype,        field2datatype, field3datatype)characterset字符集collate校验规则engine存储引擎; 说明:field表示......
  • Java面试之多线程&并发篇(9)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!引用类型有哪些?有什么区别?说说你对JMM内存模型的理解?为什么需要JMM?多线程有什么用?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理******java核心面试知识整理******Java高频......
  • ThreadLocal是如何实现线程隔离的?
    ThreadLocal是Java中实现线程隔离的关键工具。它通过提供每个线程自己的变量副本来确保线程之间数据的独立性。下面是ThreadLocal如何实现线程隔离的详细讲解:1.数据存储结构ThreadLocal关键在于其内部管理的数据存储结构。在Java中,ThreadLocal创建了一个与线程......
  • MySQL使用sysdate()导致无法使用索引以及NLJ驱动表结果集增大
     MySQL使用sysdate()导致无法使用索引以及NLJ驱动表结果集增大 MySQL版本:8.0.36最近遇到一条MySQL的慢语句优化,发现是sysdate()导致的问题。现在大致模拟一下环境。 创建表以及对应索引,如下:createtablezkm(idint,dtimedatetime,c3int);createindexidx_z_dtime......