后台线程
后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行的状态。
InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。Master Thread
、IO Thread
、Purge Thread
、Page Cleaner Thread
等。
1.Master Thread
核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性,包括脏页的属性、合并插入缓冲、UNDO页的回收
2.IO Thread
在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,极大提高数据库性能。而IO Thread住哟处理这些IO请求的回调处理。
InnoDB 1.0之前有4个IO Thread,分别是write
,read
,insert buffer
,log IO thread
。Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下可以通过innodb_file_io_threas
参数来增加IO Thread。
InnoDB 1.0.x版本开始,read thread和write thread分别增大到4个,并且不再使用innodb_file_io_threads
参数,而是分别使用innodb_read_io_threads
和innodb_write_io_threads
参数进行设置。
# 查看read thread和write thread的数量
mysql> show variables like 'innodb_%io_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_read_io_threads
Value: 4
*************************** 2. row ***************************
Variable_name: innodb_write_io_threads
Value: 4
2 rows in set (0.00 sec)
使用show engine innodb status\G
可以查看InnoDB中的IO Thread:
mysql> show engine innodb status\G;
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
......
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
.......
从查询结果可以看出,thread 0是insert buffer thread,thread 1是log thread,thread2-5是read thread,thread 6-9是write thread。
3.Purge Thread
事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。在InnoDB 1.1版本之前,purge操作仅在InnoDB存储引擎的Master Thread中完成。而从InnoDB 1.1版本开始,purge操作可以独立到单独的线程中进行,以减轻Master Thread的工作,从而提高CPU的使用率以及提升存储引擎的性能。用户可以在MySQL数据库配置文件中添加以下配置来启用独立的Purge Thread:
# my.cnf文件中
[mysqld]
innodb_purge_threads=1
InnoDB 1.2版本之后,为了加快undo页的回收,进一步利用磁盘的随机读写性能,InnoDB开始支持多个Purge Thread:
mysql> show variables like 'innodb_purge_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
Value: 4
1 row in set (0.05 sec)