//
Innodb存储引擎中的后台线程介绍
//
在Innodb存储引擎中,后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外它会将已经修改的数据文件刷新到磁盘文件中,保证数据库在发生异常的情况下,Innodb能够恢复到正常的运行状态。上一节中我们讲到了redo log的刷盘操作,其实就是后台线程帮忙完成的。
innodb存储引擎本身是多线程模型,因此,后台有多个不同的线程,它们各司其职,互相配合,完成内存池的刷新操作。
01
Master Thread
该线程是核心后台线程,主要负责将缓冲池中的数据一步刷新到磁盘,保证数据的一致性,它的工作包括:脏页的刷新、合并插入缓冲、undo页的回收等等。关于合并插入缓冲,如果大家感兴趣,可以查看之前写的一篇文章:
02
IO Thread
Innodb存储引擎中,使用了大量的Async IO操作,也就是异步IO操作,之所以异步,是因为IO操作耗时长,如果同步的话,影响数据库性能。IO线程主要负责处理这些IO请求的回调。IO线程包含read thread、write thread、insert buffer thread和Log Thread,在MySQL5.7.16版本中,read thread和write thread分别有4个,如下:
2 rows in set (0.00 sec)
mysql> show variables like "%innodb%io_threads%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_read_io_threads | 4 |
| innodb_write_io_threads | 4 |
+-------------------------+-------+
可以使用show engine innodb status的语句来查看当前IO线程的工作状态:
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
03
Purge Thread
事务提交之后,其所属的undo log废弃,因此需要Purge Thread来回收已经使用并分配的undo 页。早前的MySQL版本只支持一个Purge Thread,目前mysql 5.7版本支持多个Purge Thread,这样做的目的是为了进一步加快undo数据页的回收速度。
mysql> show variables like "%purge_threads%";
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_purge_threads | 4 |
+----------------------+-------+
1 row in set (0.00 sec)
04
Page Cleaner Thread
Page Cleaner Thread的作用是将之前版本中的脏页刷新操作都放入到单独的线程中来完成,其目的是为了减轻原来的Master Thread的工作,同时可以缓解用户查询线程的阻塞,进一步提高Innodb 存储引擎的性能。