InnoDB的Master Thread调度流程

12 月 15th, 2010 | Posted by | Filed under 未分类

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/database/innodb_master_thread.html

InnoDB的主要IO操作都是在Master Thread(srv0srv.c)中完成的,所以分析InnoDB的IO调度,就一定要分析Master Thread线程。

下面是我画的一张流程图,标识了整个Master Thread的调度流程。红色部分是InnoDB Plugin/XtraDB对原有InnoDB引擎的改进。
每个Process文字中最下面的括号是进行这个操作的具体函数,可以参照源代码阅读本图。

顺便解释一下“插入缓冲”(Insert Buffer):InnoDB为了避免更新数据时更新索引损失太多性能,使用了这种称为Insert Buffer的方法来缓冲索引更新,对于非聚集索引(主键索引)、唯一索引的修改,不是每次都直接插入索引页,而是先判断要更新的这一页在不在内存中,如果不在则存入Insert Buffer,按照Master Thread的调度规则来合并非唯一索引和索引页中的叶子结点,这样经常能减少更新索引的代价。为什么要求是非唯一索引(排除主键索引和唯一索引)呢?因为唯一索引要检查记录是不是存在,所以必须把修改的记录影响的索引页读出来才知道是不是唯一,这样Insert Buffer就没意义了,反正要读出来,所以只对非唯一索引有效。
show innodb status中的“INSERT BUFFER AND ADAPITIVE HASH INDEX”里面显示了Insert Buffer的效果。

更正一部分,发现在刷新100个赃页后,InnoDB认为刷新耗时已经超过一秒了,无需等待,设置skip_sleep=TRUE,直接跳过os_pthread_sleep,进行下一次判断。

InnoDB Master Thread

  1. duxing
    12 月 15th, 201013:33

    看了这个图对流程更清楚了

    [回复]

  2. 伦达国贸城
    12 月 18th, 201006:34

    这模板倒是不错…..

    [回复]

  3. Tom
    12 月 25th, 201023:36

    这个《MySQL技术内幕:InnoDB存储引擎》不是已经有讲过了吗?

    [回复]

    P.Linux 回复:

    是的,参照书上的说明,我才将这个图完善,但图中还是漏了一个细节,就是在刷新100个赃页后,InnoDB认为刷新耗时已经超过一秒了,无需等待,设置skip_sleep=TRUE,直接跳过os_pthread_sleep,进行下一次判断。
    这个是在与一个开发工程师交流时对方提问如果每次都等1s,这与我们看到的性能图指标是对不上的,重新Review整个srv0srv.cc,发现skip_sleep这个变量被我们忽略了。

    [回复]

  4. ymh
    1 月 31st, 201117:50

    每十秒钟时,判断脏页比例那个地方是不是有点问题。应该是YES时刷新10个,NO时刷性100个吧。

    [回复]

  5. yanzongshuai
    6 月 12th, 201523:58

    这个是老版本的吧,mysql5.6中的innodb主线程已经不做purge操作了吧?

    [回复]

    P.Linux 回复:

    @yanzongshuai, 对,5.6有独立的Purge线程

    [回复]