在InnoDB的后台线程中,分为4类,分别是:Master Thread 、IO Thread、Purge Thread、Page Cleaner Thread。
Master Thread
核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中, 保持数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收 。
Master thread内部有两个主要处理时机,分别是每隔1秒和10秒处理。
- 每隔1秒的操作
- 重做日志缓冲刷新到磁盘redo log文件,即使该事务还没提交。这也解释了为什么再大的事务commit的时间也是很快的。
- InnoDB引擎会判断当前一秒的IO次数,如果小于5次,则认为当前IO压力很小,就会执行合并插入缓冲的操作。
- InnoDB会判断当前缓冲池中脏页的比例是否超过了配置文件的参数(默认90,代表90%),如果超过这个阈值,则会将至多100个脏页写入磁盘。
- 如果当前用户没有活动,则切换到background loop。
- 每隔10秒的操作
- InnoDB会判断过去10秒之内的磁盘IO操作是否小于200次,如果是则认为当前有足够的磁盘IO能力,因此
将100个脏页刷新到磁盘
。 - 合并至多5个插入缓冲。
- 将日志缓冲刷新到磁盘。
- 执行full purge操作,删除无用的undo页。事实上在对MySQL表执行update、delete操作时,原先的行被标记为删除,但是由于一致性读的关系,需要保留这些行版本的信息。在full purge的过程中,InnoDB会判断当前事务系统已被删除的行是否可以删除(比如有时候可能还有查询操作需要读取之前的版本的undo信息),如果可以,InnoDB会立即将其删除。
- 刷新100个(脏页的比例大于70%)或10个(脏页的比例小于70%)脏页到磁盘。
- 产生一个检查点(checkpoint)。将最老日志序列号(oldest LSN)的页写入磁盘。
- InnoDB会判断过去10秒之内的磁盘IO操作是否小于200次,如果是则认为当前有足够的磁盘IO能力,因此
-
IO Thread
- 在
InnoDB
存储引擎中大量使用了AIO来处理IO请求, 这样可以极大地提高数据库的性能,而IOThread主要负责这些IO请求的回调。线程类型 默认个数 职责 Read thread 4 负责读操作 Write thread 4 负责写操作 Log thread 1 负责将日志缓冲区刷新到磁盘 Insert buffer thread 1 负责将写缓冲区内容刷新到磁盘
Purge Thread
主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收。默认是由master thread中完成。为了减轻master thread的工作,提高cpu使用率可以通过配置参数innodb_purge_thread=1
启动独立线程。
Page Cleaner Threa
协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞。