一、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是负责锁的监控线程