一、MySQL后台进程简介

master thread与四大I/O线程:read thread、write thread、redo log thread、change buffer thread与

page cleaner thread、purge thread、checkpoint、error monitor thread、lock monitor thread。

二、master thread

后台进程Master thread 里面有两种循环,再循环内可以调用其他线程进行相关的操作。

master thread的线程优先级别最高。

其内部几个循环(loop)组成:主循环(loop),后台循环(background loop),刷新循环(flush loop),暂停循环(suspend loop)。

主循环有1s循环和10s循环. 1s循环即循环执行一次就sleep 1s后又执行一次又sleep 1 s.

srv_master_thread loops: 745 1_second, 744 sleeps, 60 10_second, 179 background, 179 flush

srv_master_thread log flush and writes: 744

各种循环执行的次数,据此判断系统负载高低

1、主循环loop包含两个操作

1s操作

1)日志缓冲刷新到磁盘,即使这个事务没有提交

2)刷新脏页到磁盘

3)执行和并插入缓冲的操作

4)产生checkpoint

5)清除无用的table cache

6)如果当前没有用户活动,就可能切换到background loop

10s操作

1)日志缓冲刷新到磁盘,即使事务还没有提交

2)执行和并插入缓冲的操作

3)刷新脏页到磁盘

4)删除无用的undo页

5)产生checkpoint

三、log buffer thread

log buffer thread负责把日志缓冲中的内容刷新到redo log文件中。

四、change buffer thread

change buffer thread负责把插入缓冲(change buffer)中的内容刷新到磁盘。

五、read/write thread

read/write thread是数据库的读写线程,默认值都是4个。

如果使用高转速的磁盘,可以适当调大该值。

1、读操作:innodb_read_io_threads,读线程  默认四个,负责数据块的读入

  1、发起者:用户线程发起读请求
  2、完成者:读线程执行请求队列中的读请求操作
  3、如何调整读线程的数量
mysql> show variables like 'innodb_read_io_threads';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_read_io_threads | 4     |
+------------------------+-------+
1 row in set (0.01 sec)
2、写操作:innodb_write_io_threads,写线程  默认四个,负责数据块的写出

  1、发起者:page_cleaner线程发起
  2、完成者:写线程执行请求队列中的写请求操作
  3、如何调整写线程的数量
mysql> show variables like 'innodb_write_io_threads';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| innodb_write_io_threads | 4     |
+-------------------------+-------+
1 row in set (0.01 sec)

六、page cleaner thread

page cleaner thread是负责脏页刷新的线程。

MySQL5.7之后可以增加多个。

七、purge thread

purge thread负责删除无用的undo页。由于进行DML语句的操作都会生成undo,系统需要定期

对undo页进行清理,这是需要purge操作。

MySQL5.6开始,把purge thread专门从master thread中分离出来,通过innodb_purge_thread参数

来控制purge的线程个数。默认为1个,最大可以调整为32个。

作用: 真正的删除记录和删除undo log

1.清理删除后的数据页的空间(因为之前的删除只是打上删除标签,并没有正真删除),

2.清理undo

举例:表tb1中有记录pk=1,2,3;

此时delete from tb1 where pk=1;

1. 将pk=1的记录标记为删除(delete-mark,infobits),数据库中pk=1的记录此时还是存在的,空间并没有被释放,该操作为同步操作(SQL执行完,也就标记完成了)。

2. purge ,该部分为后台线程(purge线程)异步操作,会真正的删除该记录,且空间被释放。purge线程是系统自动的,无法人工控制。

标记为已删除的原因:

1. 该事物可能需要回滚,先作保留。

2. 当事物1去删除pk=1且没有提交时, 事物2应该要能看到pk=1的记录(事物的隔离性)。

过滤条件是聚簇索引:

1. delete – 将该记录标记为 delete-mark 。

2. update – 将该记录 先物理delete (聚簇索引里主键相同的行最多只能有1个),然后 insert (或者可以原地更新[in place update])(即使删除了,也可以通过undo进行还原)。

过滤条件是二级索引:

1. delete – 将该记录标记为 delete-mark 。

2. update – 将该记录标记为 delete-mark (索引列是columns + pk,即使是唯一索引更新也是和原来的不一样),然后 insert 。

为什么没有insert”

1. insert操作是不需要异步去purge,因为insert的记录之前是不存在的;

2. 不存在记录(未提交)是没有别的事物能引用到的,所以insert以后,对应的undo可以直接删除,而不需要等待异步.

purge 总结:

1. delete-mark的记录最后会被purge线程回收,Purge会检测记录上是否有其他事物在引用undo,如果没有就可以删除。

2. innodb_purge_threads (5.6以后),可以设置的大一些,回收的速度会快一些。

innodb_purge_threads = 4

八、checkpoint线程

checkpoint线程的作用是在redo log发生切换时,执行checkpoint。redo log发生切换或者文件快写

满时,会触发把脏页刷新到磁盘。还有就是确保redo log刷新到磁盘,实现真正的持久化,避免数据丢失。

九、error monitor thread

error monitor thread时负责数据库报错的监控线程

十、lock monitor thread

lock monitor thread是负责锁的监控线程

Mysql 实列结构-进程的更多相关文章

  1. docker中启动2个mysql实列

    一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...

  2. Mysql实训任务书

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6635189537079296526/ 什么是数据库:数据库(Database)是按照数据结构来组织.存储和管理数据 ...

  3. mysql 复制表结构、表数据的方法

    From: http://blog.163.com/yaoyingying681@126/blog/static/109463675201191173221759/ MySQL 添加列,修改列,删除列 ...

  4. paip.解决 数据库mysql增加列 字段很慢添加字段很慢

    paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6    数据仅仅3w alter table xxx add column yyy int default ...

  5. mysql 的 存储结构(储存引擎)

    1 MyISAM:这种引擎是mysql最早提供的.这种引擎又可以分为静态MyISAM.动态MyISAM 和压缩MyISAM三种:    静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的, ...

  6. mysql多列索引和最左前缀

    数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用 ...

  7. 用户中心mysql数据库表结构的脚本

    /* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...

  8. mysql数据库表结构导出

    mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...

  9. 在本地计算机无法启动MYSQL服务错误1067进程意外终止

    在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...

随机推荐

  1. 第 2 章 容器架构 - 007 - Docker 架构详解

    Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

  2. python中函数与函数式编程(一)

    在学习之前,我们先去区分面对对象.面对过程.函数式编程他们之间的区别,从改图可以看出,他们之间不是完全相同的,也不是没有任何相同点的 1.函数和过程的基本认识 def func1(): "& ...

  3. legend2---开发日志8(thinkphp和vue如何配合才能达到最优)

    legend2---开发日志8(thinkphp和vue如何配合才能达到最优) 一.总结 一句话总结:凡是php可以做的,都可以先在后端处理好数据,然后再丢给前端 凡php可以做的,都可以先在后端处理 ...

  4. 自定义WPF控件(MyTextBox、MyDatePicker、MyDataGrid)

    方案一:样式与代码结合 按照UserControl的前后台结合的方式编写MyControl,前台写样式,后台写功能.规则等(创建一个UserControl,然后修改一下即可) 方案二:样式与代码分离 ...

  5. Spring Boot之实现自动配置

    GITHUB地址:https://github.com/zhangboqing/springboot-learning 一.Spring Boot自动配置原理 自动配置功能是由@SpringBootA ...

  6. vue给元素动态添加class

    <p class="answerNum2" v-text="iteme.sel_num" :class="{letter: num }" ...

  7. 反射API(一)

    <?php function classData(ReflectionClass $class) { echo '<hr>'; $details = '当前文件:'; $detail ...

  8. Django中模型层中ORM的单表操作

    ORM概念: MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  9. 进程锁,队列,JoinableQueue

    内容梗概: 1.进程同步(锁) 2.队列(重点) 3.生产者消费者模式 4.JoinableQueue([maxsize]) 5.信号量(了解) 6.事件 1.进程同步(锁) 并发编程让我们能更加充分 ...

  10. Web 自动化测试框架 sweetest 介绍

    项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...