Mysql 实列结构-进程
一、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,读线程 默认四个,负责数据块的读入
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_read_io_threads | 4 |
+------------------------+-------+
1 row in set (0.01 sec)
+-------------------------+-------+
| 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 实列结构-进程的更多相关文章
- docker中启动2个mysql实列
一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...
- Mysql实训任务书
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6635189537079296526/ 什么是数据库:数据库(Database)是按照数据结构来组织.存储和管理数据 ...
- mysql 复制表结构、表数据的方法
From: http://blog.163.com/yaoyingying681@126/blog/static/109463675201191173221759/ MySQL 添加列,修改列,删除列 ...
- paip.解决 数据库mysql增加列 字段很慢添加字段很慢
paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6 数据仅仅3w alter table xxx add column yyy int default ...
- mysql 的 存储结构(储存引擎)
1 MyISAM:这种引擎是mysql最早提供的.这种引擎又可以分为静态MyISAM.动态MyISAM 和压缩MyISAM三种: 静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的, ...
- mysql多列索引和最左前缀
数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用 ...
- 用户中心mysql数据库表结构的脚本
/* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...
- mysql数据库表结构导出
mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...
- 在本地计算机无法启动MYSQL服务错误1067进程意外终止
在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...
随机推荐
- C#模拟HTTP请求并发送二进制
public static String Submit(String methodName) { string postData = "this is post data";//请 ...
- css趣味案例:画三角形
代码: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&q ...
- LeetCode--231--2的幂函
问题描述: 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1: 输入: 1 输出: true 解释: 2 0 = 1 示例 2: 输入: 16 输出: true 解释: 2 4 ...
- Django用户认证组件
用户认证 主要分两部分: 1.auth模块 from django.contrib import auth 2.User对象 from django.contrib.auth.models imp ...
- 55-56 ORM多表查询
多表查询: KEY ====> 通过ORM引擎如何跨表: 正向查询按字段,反向查询按表名小写 模型的创建: from django.db import models # Create yo ...
- lanmp环境中php版本的升级为7.1
查看php版本的信息 vim ./lib/phps.sh 设置权限 chmod 755 ./lib/phps.sh 下载版本 ./lib/phps.sh 7.1.4 查看版本 php -v ...
- 【IDEA】【8】上传已有项目到Git
问题:开发初期没有建立GIT仓库,开发一段时间后,需要将已有代码上传到Git 解决方案: 1,首先使用Git命令行 git clone XXXXX.git 将项目下载 2,拷贝下载下来的项目根目录下的 ...
- kohana操作数据库
一.读取数据库记录 读取数据库记录需要使用到 DB::select() 方法 // 返回一个结果对象 $result = DB::select('column')->from('table_na ...
- 移动端页面利用好viewport,适配各种宽度屏幕
最近研究微贷网的移动端代码,发现他们网站在适配不同宽度屏幕的显示情况时,发现他们并不是利用rem单位,而是利用js动态设置mete的viewport来达到适配的效果. 感觉挺不错的,也不需要计算什么东 ...
- mybatis调用存储过程的两种方式
先总结和说明一下注意点: 1.如果传入的某个参数可能为空,必须指定jdbcType 2.当传入map作为参数时,必须指定JavaType 3.如果做动态查询(参数为表名,sql关键词),可以使用${} ...