内部由多个循环组成:主循环(loop),后天循环(backgroup loop),刷新循环(flush loop),暂停循环(suspend loop)
Master Thread 会根据数据库运行状态在各个循环中进行切换
Loop主循环(大部分操作):每1秒的操作和每10秒的操作
每秒的操作:
1.日志缓冲刷新到磁盘,即使事务没有提交(总是)----->即使再大的事务,提交(commit)时间也很短的原因
2。合并插入缓冲(可能)---->Innodb会判断前一秒的IO次数是否小于5次,小于的话任务IO压力小,可以进行合并插入缓冲
3.至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)--->Innodb判断缓冲池中脏页的比例(buf_get_modified_ratio_pct)是否超过配置文件中的(innodb_max_dirty_pages_pct)参数,若超过阈值,则做此操作
4.若当前没有用户活动,则切换到background loop(可能)
每10秒的操作:
1.刷新100个脏页到磁盘(可能)
2.合并至多5个插入缓冲(总是)
3.将日志刷新到磁盘(总是)
4,删除无用的Undo页(日志)(总是)
5.刷新100个或者10个脏页到磁盘(总是)
InnoDB会先判断过去10秒之内磁盘的IO操作是否小于200次,是的话,InnoDB认为当前有足够的磁盘IO操作能力,会将100个脏页刷新到磁盘,并合并插入缓冲,陆续上面的顺序,刷新日志。然后InnoDB执行full purge(完全净化)操作(删除无用的Undo页,每次最多尝试回收20个undo页)。对表进行update,delete操作时,原先的行被标记为删除,因为一致性读(consistent read)的关系,需要保留这些行版本的的信息,full purge时,会先判断当前事务系统中的已删除的行是否可以被删除,若可以,会立即被删除。最后,判断脏页比例来刷新脏页(buf_get_modified_ration_pct),超过70%刷100个,少于的话刷10%
若数据库空闲或者关闭时,background loop执行:
删除无用Undo页(总是)
合并20个插入换缓冲(总是)
跳回主循环(总是)
不断刷新100个页直到符合条件(可能,跳转到flush loop完成)
InnoDb1.0.x版本之后~InnoDB1.2.x版本之前
新增参数innodb_io_capactity(磁盘IO吞吐量,默认200):(解决InnoDB对IO操作的限制)
1.合并插入缓冲时,合并插入缓冲的数量为innodb_io_capactiy值的5%;
2.在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capactiey;
innodb_max_dirty_pages_pct值可调(默认变为75,不是100):加快脏页刷新频率,保证IO负载
新增innodb_adaptive_flushing(自适应刷新):
innodb通过buf_flush_get_desired_flush_rate(判断产生重做日志的速度)函数来判断需要刷新脏页的数量
新增参数innodb_purge_batch_size:
控制每次full purge回收的Undo页的数量,默认还是20
InnoDB1.2.x版本之后:
刷新脏页的操作,分离到Page Cleaner Thread中,减轻Master Thread负担