常见mysql后台线程

时间:2022-09-05 11:03:53

 1.IO THREAD

 MySQL有很多后台线程

其中包括了负责IO的相关线程IO THREAD

1. 参数innodb_write_io_threads  写线程 默认四个,负责数据块的写入

2. 参数innodb_read_io_threads 读线程  默认四个,负责数据块的读取

上面两个参数高并发下,可以设置为8.

 2.Purge thread

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

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

 2.清理undo

举例:tb1中有记录pk=123;

此时delete from tb1 where pk=1;

1. pk=1的记录标记为删除(delete-markinfobits),数据库中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

 

 3.Insert-buffer thread

负责insert buffer与辅助索引的合并操作。

 4.redo-log thread

负责重做日志缓冲的磁盘写入

 5.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

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