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文件试试, 要适当地改 ...
随机推荐
- U8工具栏特别小是怎么回事
用友的工具栏特别窄了,填制凭证里的保存.增加凭证等按钮因为工具栏特别窄都看不清了 解决方法:正常机器下的system32下面的mscomctl.ocx文件替换到有问题的机器下,您的系统应该是XP的,这 ...
- 牛客国庆集训派对Day3 B Tree
Tree 思路: 树形dp 注意0不存在逆元,任何一个数乘以0就变成0了,就没有价值浪,所以要暴力转移 代码: #pragma GCC optimize(2) #pragma GCC optimize ...
- Codeforces 961E - Tufurama
961E - Tufurama 思路: 线段树或者分块 遍历 1 - n - 1,求 区间[i + 1, min(a[i], n)]大于等于 i 的个数,累加起来 线段树: #include<b ...
- Codeforces 797E - Array Queries
E. Array Queries 题目链接:http://codeforces.com/problemset/problem/797/E time limit per test 2 seconds m ...
- Java方法重载的区分
测试程序代码: class Computer { private int x; public Computer(){ this(10); } /** * 构造方法重载 * @param x */ pu ...
- stock 基本操作
追涨停 量比 大于5 0%-2% 个股 2点卖 37分钟买 板块5 -8 只涨停 板块分向标 追踪短期个股的涨跌现象 明白市场大级别趋势 主 ...
- dedecms自定义表单时间时间戳值类型的转换方法
找网站找的别人的方法,记录一下 修改/dede/templets/diy_list.htm,在第42行else前面加上以下代码: else if($fielddata[1]=='datetime') ...
- leetcode-algorithms-21 Merge Two Sorted Lists
leetcode-algorithms-21 Merge Two Sorted Lists Merge two sorted linked lists and return it as a new l ...
- oracle查看列数据类型
select * from user_tab_columns where table_name = upper('表名')
- ES6 开发常用新特性以及简述ES7
一.关于变量 ES6新增:块级作用域变量 1.let定义块级作用域变量 没有变量的提升,必须先声明后使用 let声明的变量,不能与前面的let,var,conset声明的变量重名 { { consol ...