MySQL-InnoDB后台线程


作者:刘仁鹏
参考资料:《MySQL技术内幕:InnoDB存储引擎》


1.四种后台线程

1.Master Thread

  • 负责 将缓冲池中的数据异步刷新到磁盘 ,保证数据的一致性。
    包括合并插入缓冲重做日志缓冲写入磁盘、脏页的刷新(在PageCleanerThread中做)、UNDO页的回收(在PurgeThread中做)等。
  • Master Thread内部由多个循环组成:主循环(loop)、后台循环(background loop)、刷新循环(flush loop)、暂停循环(suspend loop)
  • Master Thread会根据数据库运行的状态在上述循环中进行切换
  • 下文中合并插入缓冲和脏页刷新操作中“一定数量”的计算依据来自于innodb_io_capacity参数,该参数由用户设定,表示磁盘IO吞吐量

1.主循环

  • 主循环中包含两大部分操作:innodb is not idle时的操作(老版本每秒的操作)和innodb is idle时的操作(老版本每10秒的操作)

1.innodb is not idle时的操作

  1. 重做日志缓冲写入磁盘,即使该事务未提交(总是)
  • 这就是为什么再大的事务,提交时间也很短的原因
  1. 合并插入缓冲(可能)
  • InnoDB会根据当前IO次数判断IO压力大小,若IO压力小,才会合并插入缓冲
  1. 将一定数量的脏页刷回磁盘(可能)
  • 根据产生重做日志的速度,和innodb_max_dirty_pages_pct参数所设阈值,决定是否进行该操作,以及操作的脏页数量
  1. 若没有用户活动,切到后台循环(可能)

2.innodb is idle时的操作

  1. 将重做日志缓冲写入磁盘(总是)
  2. 合并一定数量的插入缓冲(总是)
  3. 将一定数量的脏页刷回磁盘(总是)
  4. 删除一定数量无用Undo页(总是)
  • 删除数量受innodb_purge_batch_size参数值影响

2.后台循环

  1. 删除无用Undo页(总是)
  2. 合并一定数量插入缓冲(总是)
  3. 若有用户活动,跳回主循环,否则,跳入刷新循环(总是)

3.刷新循环

  1. 将一定数量的脏页刷回磁盘(总是)
  2. 跳入暂停循环(总是)

4.暂停循环

  1. 将Master Thread挂起
  2. 若有事件发生,跳入主循环(总是)

2.IO Thread

  • InnoDB使用了大量 AIO 来处理IO请求以提高性能,IO Thread的主要工作是 处理这些IO请求的回调
  1. write thread
  2. read thread
  3. insert buffer thread
  4. log thread

3.Purge Thread

  • 事务被提交后,其所使用的 undolog 可能不再需要,因此需要PurgeThread来 回收已经使用并分配的undo页

4.Page Cleaner Thread

  • 脏页的刷新。

你可能感兴趣的:(MySQL-InnoDB后台线程)