今天和大家分享InnoDB的线程模型相关知识

在MYSQL中,有很多的线程,主要作用是负责刷新chang buffer、buffer pool、log buffer等内存池中的数据,将磁盘上的数据页加载到内存当中,并且保持磁盘中的数据是最新的状态,另外在内存当中对数据进行修改之后,需要将脏页进行刷盘操作,还有数据库发生异常,需要进行数据回滚操作等等,都是通过后台线程进行处理的,下面就和大家介绍主要的相关线程。

mysql负责io的线程有 mysql io线程_InnoDB


InnoDB线程主要分为四种,分别是Master Thread、IO Thread、Purge Thread、Page Cleaner Thread。

1. IOThread

作用: 主要是用做读写处理
我们可以通过命令show engine innodb status;来查看读写线程的相关状态,执行之后的数据页面如下:

mysql负责io的线程有 mysql io线程_mysql_02

read Thread:

负责读取操作,将数据从磁盘加载到内存中page页中(有4个)

write Thread:

负责写操作,将脏页刷新到磁盘(有4个)

log Thread:

负责将日志缓冲区内容刷新到磁盘(有1个)

insert buffer Thread:

负责将写缓冲区内容刷新到磁盘(有1个)

2. Purge Thread

作用: 用于事务提交之后回收undo页
我们可以通过命令%innodb_purge_threads%;来查看该线程的数量,执行之后的页面如下:

mysql负责io的线程有 mysql io线程_java_03


我们可以看到,默认设置的purge thread的数量是4个,这样可以更快的回收undo页。

3. Page Cleaner Thread

作用: 将脏数据刷新到磁盘
我们可以通过命令%innodb_page_cleaners%;来查看该线程的数量,默认是1。
注意: page cleaner thread其实是会调用write thread线程来进行写操作

4. Master Thread

作用: InnoDB的主线程,负责调用其他的线程,优先级最高。
该线程会定时处理数据,每一秒会执行一些操作,每十秒也会执行一些操作,具体执行哪些操作呢?

每一秒的操作:

1.刷新脏页数据到磁盘,根据脏页比例达到75%才操作。我们可以通过命令show variables like 'innodb_max_dirty_pages_pct;'来查看刷新脏页百分比配置,执行命令后的页面如下:

mysql负责io的线程有 mysql io线程_InnoDB_04


那么达到刷新比例要求,会刷新多少脏页数据到磁盘呢,我们可以通过show innodb_io_capacity;命令查看刷新容量大小:


mysql负责io的线程有 mysql io线程_mysql负责io的线程有_05


默认是200

2.合并写缓冲区数据:如果一秒的IO次数小于5,认为IO的压力较小,可以执行合并缓冲区的操作(可能会做)。

3.刷新日志缓冲区:即使事务没有提交,InnoDB也会每秒将重做日志缓冲区的内容刷新到重做日志文件中。(一定会做)

每10秒的操作:

1.刷新脏页数据到磁盘,刷新的脏页数量为innodb_io_capacity(可能会做)
2.合并写缓冲区的数据,合并写缓冲区的大小是innodb_io_capacity的5%(一定会做)
3.刷新日志缓冲区(一定会做)
4.删除无用的undo页(一定会做)