InnoDB体系架构
后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
后台线程
1. Master Thread
Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页刷新、合并插入缓冲(INSERT BUFFER)、UNDO页的回收等。
2. IO Thread
在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调(call back)处理。
IO Thread分类:
write io thread
read io thread
insert buffer io thread
log io thread
InnoDB 1.0版本之前共有4个IO Thread,分别是:
write
、read
、insert buffer
和log IO thread
。
在Linux平台下,IO Thread
的数量不能进行调整,但是在Windows平台下可以通过参数innodb_file_io_threads
来增大IO Thread。
从InnoDB 1.0.x版本开始,
read thread
和write thread
分别增大到了4个,并且不再使用innodb_file_io_threads
参数,而是分别使用innodb_read_io_threads
和innodb_write_io_threads
参数进行设置,如:
Mysql语句
# 查看read io和write io线程数量
mysql> show variables like '%io_thread%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_read_io_threads | 4 |
| innodb_write_io_threads | 4 |
+-------------------------+-------+
# 查看Innodb状态信息
mysql> show engine innodb statusG;
3. Purge Thread 后台清理
-
事务被提交后,其所使用的
undolog
可能不再需要,因此需要Purge Thread
来回收已经使用并分配的undo页。 -
InnoDB中delete所做删除只是标记为删除的状态,实际上并没有删除掉,因为MVCC机制的存在,要保留之前的版本为并发所使用。最终的删除由purge线程来决定的什么时候来真正删除文件的。
调整线程数
mysqld --innodb-purge-threads=#
ps:Purge Thread
默认每次清理大小为:300个page,可通过参数innodb_purge_batch_size
调整。
4. Page Cleaner Thread
Page Cleaner Thread是在InnoDB 1.2.x版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。
mysql> show variables like '%cleaner%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_page_cleaners | 1 |
+----------------------+-------+
# 查看缓冲池等待数据,如果数据过大则需要调整innodb_page_cleaners参数
mysql> show status like '%wait_free';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| Innodb_buffer_pool_wait_free | 0 |
+------------------------------+-------+