Master Thread 是核心的后台线程。
InnoDB 1.0.x 版本之前(MySQL 5.1 之前):
Master Thread 具有最高的线程优先级别。内部由多个循环(loop)组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。Master Thread 根据 数据库运行状态进行切换。
主循环(loop):大多数操作都在这个循环中,通过 thread sleep 实现每秒钟的操作和每10秒钟的操纵。
每秒一次的操作:
1.日志刷新到磁盘(总是)
2.合并缓冲插入(会对前一秒的 IO 进行查询,小于5次 压力小,进行合并缓冲插入操作)
3.最多刷新100个 InnoDB 缓冲池中的脏页到磁盘。(判断当前缓冲池中脏页比例(buf_get_modified_ratio_pct)是否超过文件中配置的(innodb_max_dirty_pages_pct,默认90),超过则进行操作)
4.如果当前没有用户活动,切换到background loop。
每10秒一次的操作:
1.刷新100个脏页到磁盘(判断前10秒 IO操作是否少于200次,是则将100个脏页刷新到磁盘)
2.合并最多5个插入缓冲(总是)
3.将日志缓冲刷新到磁盘(总是)
4.删除最多20个无用 undo 页(总是,执行pull perge操作,当 update 或 delete 时,原先的行被标记为删除,为了满足一致性读要求,判断事务系统中被修改的行能删除时,进行删除 )
5.刷新100个或者10个脏页到磁盘(总是,如果缓冲池中脏页比例超过70%,刷新100个,若小于刷新10个)
后台循环(background loop):当没有用户活动或数据库关闭后,切换到此线程。
1.删除无用 undo 页(总是)
2.合并20个插入缓冲(总是)
3.跳回主循环(总是)
4.不断刷新100个页直到符合条件(可能跳转到 刷新循环(flush loop)完成)
当 刷新循环中 无事,InnoDB 会切换到 暂停循环,将 Master Thread 挂起,等待事件。
InnoDB 1.2.x 版本之前(MySQL 5.1 ~ 5.6):
磁盘的发展,InnoDB 的一些规定限制了磁盘IO性能。
引入配置 innodb_io_capacity ,表示磁盘IO吞吐量,默认200。合并插入缓冲时,数量是它的5%;缓冲区刷新脏页时,数量是它。
修改 innodb_max_dirty_pages_pct,原默认值为90,只有缓冲池中的脏页比例超过90%,才进行刷新。修改默认值为75。
引入配置 innodb_adaptive_flushing(自适应刷新),影响每秒刷新脏页的数量。不仅判断脏页比例,还会根据 重做日志的速度决定最合适的刷新脏页数量。
引入配置 innodb_purge_batch_size,控制每次 full purge 回收的 undo 页数量。
InnoDB 1.2.x 版本(MySQL 5.6 及之后):
从 Master Thread 中分离刷新脏页操作到 Purge Cleaner Thread。