zoukankan      html  css  js  c++  java
  • InnoDB master thread工作原理

          我们简单交流下InnoDB master thread学习,有兴趣的朋友可以参考<<MySQL技术内蒙--InnoDB存储引擎第二版>>

    void master_thread(){
        goto loop;
    loop:
    for (int i=0;i<10;i++){
        thread_sleep(1) //sleep 1 second-->每秒执行操作(负载在情况下会延迟)
        do log buffer flush to disk  //重做日志缓冲刷新到磁盘,即使这个事务没有提交(总是)
        if ( last_ten_second_ios < 5% innodb_io_capacity) //如果当前的10次数小于(5% * 200=10)(innodb_io_capacity默认值是200)
            do merger 5% innodb_io_capacity insert buffer //执行10个合并插入缓冲的操作(5% * 200=10)
        if ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct ) //如果缓冲池中的脏页比例大于innodb_max_dirty_pages_pct(默认是75时)
            do buffer pool plush 100% innodb_io_capacity dirty page //刷新200个脏页到磁盘
        else if enable adaptive flush  //如果开户了自适应刷新
            do buffer pool flush desired amount dirty page //通过判断产生redo log的速度决定最合适的刷新脏页的数量
        if ( no user activity ) //如果当前没有用户活动
            goto backgroud loop  //跳到后台循环
    }
    
    //每10秒执行的操作
    if ( last_ten_second_ios < innodb_io_capacity)  //如果过去10内磁盘IO次数小于设置的innodb_io_capacity的值(默认是200)
        do buffer pool flush 100% innodb_io_capacity dirty page //刷新脏页的数量为innodb_io_capacity的值(默认是200)
    do merger 5% innodb_io_capacity insert buffer  //合并插入缓冲是innodb_io_capacity的5%(10)(总是)
    do log buffer flush to disk                    //重做日志缓冲刷新到磁盘,即使这个事务没有提交(总是)
    do full purge       //删除无用的undo页 (总是)
    if (buf_get_modified_ratio_pct > 70%)          //如果缓冲池中的胜页比例大于70%
        do buffer pool flush 100% innodb_io_capacity dirty page  //刷新200个脏页到磁盘
    else
        do buffer pool flush 10% innodb_io_capacity dirty page   //否则刷新20个脏页到磁盘
    goto loop
    backgroud loop:   //后台循环
    do full purge     //删除无用的undo页 (总是)
    do merger 5% innodb_io_capacity insert buffer  //合并插入缓冲是innodb_io_capacity的5%(10)(总是)
    if not idle:      //如果不空闲,就跳回主循环,如果空闲就跳入flush loop
    goto loop:    //跳到主循环
    else:
        goto flush loop
    flush loop:  //刷新循环
    do buf_get_modified_ratio_pct pool flush 100% innodb_io_capacity dirty page //刷新200个脏页到磁盘
    if ( buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct ) //如果缓冲池中的脏页比例大于innodb_max_dirty_pages_pct的值(默认75%)
        goto flush loop            //跳到刷新循环,不断刷新脏页,直到符合条件
        goto suspend loop          //完成刷新脏页的任务后,跳入suspend loop
    suspend loop:
    suspend_thread()               //master线程挂起,等待事件发生
    waiting event
    goto loop;
    }

    MySQL 5.6 InnoDB 存储引擎结构图: 

    总结:MySQL5.6中InooDB存储引擎无论是性能和功能都比之前版本改善了不少,所以建议大家使用,相当不错的一个版本^.^

    想了解更多于InnoDB相关内容,可以参考《MySQL技术内幕  InnoDB存储引擎》 作者的博客:http://insidemysql.sinaapp.com/article/4.html/innodb

    作者:陆炫志

    出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

    您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

  • 相关阅读:
    08-30 作业整理
    JS题目整理
    08-20作业整理
    CSS3知识总结
    CSS样式表知识总结
    html标签知识总结
    Dice (III) 概率dp
    Island of Survival 概率
    How far away ?
    Hdu 2874 Connections between cities
  • 原文地址:https://www.cnblogs.com/xuanzhi201111/p/4040681.html
Copyright © 2011-2022 走看看