InnoDB(Master Thread工作方式)(读MySQL技术内幕-InnoDB存储引擎)

内部由多个循环组成:主循环(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负担

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值