• 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

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

  • 相关阅读:
    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
    asp.net cookie and session
    leelazero and google colab
    download file by python in google colab
    physical processor, core, logical processor
    通过powershell操作eventlog
    openxml in sql server
    get the page name from url
    How to Execute Page_Load() in Page's Base Class?
    Difference between HttpContext.Request and Request
  • 原文地址:https://www.cnblogs.com/xuanzhi201111/p/4040681.html
Copyright © 2020-2023  润新知