InnoDB存储引擎之Master Thread的工作方式

InnoDB 1.0.X版本之前的Master Thread
Master Thread拥有最高的线程优先级:后台有多个循环(主循环,后台循环,刷新循环,暂停循环)。
在主循环中有两大部分的操作,分别是每秒执行的操作,每十秒执行的操作:
每秒执行的操作
(1)redo log刷新到磁盘,即使这个事务没有提交(总是),这也很好的解释了为什么再大的事务提交时间总是很短。
(2)合并插入缓冲:当前IO次数<5的时候,InnoDB认为当前的IO压力比较小,可以执行合并插入缓冲的操作。
(3)至多刷新100个脏页到磁盘:首先判断当前缓冲区中脏页的比例,如果超过阈值(默认是90%),那么InnoDB就认为有必要进行脏页刷新操作,就会将至多100个脏页进行刷新。
(4)当前没有用户活动,切换到backgroud look(可能)。
每十秒执行的操作
(1)刷新100个脏页到磁盘:判断过去10秒内的IO操作<200次,那么就执行这个操作。
(2)合并插入缓冲(总是)
(3)redo log刷新到磁盘(总是)
(4)删除无用的Undo页(总是):对于delete,update操作,原先的行会被标记为删除,但是由于一致性读的关系,需要保留这些行版本信息。在执行full purge过程中,InnoDB会判断已经被标记为删除的行是否真的可以删除,如果可以删除,那么立即进行删除,实际上在执行full purge操作的时候,每次最多尝试删除20个undo页。
(5)刷新100个或者10个脏页到磁盘:判断当前脏页的比例,若>70%,那么就刷新100个脏页到磁盘,否则刷新10个脏页到磁盘。(第1步操作,刷新100个之后还有这么多脏页)
background loop:当前没有用户活动或者数据库关闭,如果这个loop中也没有什么事情可以做,那么就会挂起
(1)删除无用的undo
(2)合并20个插入缓冲
(3)跳到主循环
(4)不断刷新100个页直到符合条件

在InnoDB1.2.x之前版本的Master Thread
引入innodb_io_capacity来控制刷先到磁盘的页数:
(1)合并插入缓冲的时候,默认的合并数为innodb_io_capacity的5%
(2)从缓冲区刷新脏页的时候,默认值为innodb_io_capacity

在InnoDB1.2.x之后版本的Master Thread
独立处一个Page Cleaner Thread专门用来做脏页刷新。

你可能感兴趣的:(MySql)