「这是我参与 2022 首次更文挑战的第 21 天,活动详情查看:2022 首次更文挑战」
君子以见善则迁,有过则改。
1 前言
前文讲述了 mysql 数据库的存储引擎的类型,本文继续分享 mysql 数据库中的重要的数据库引擎,InnoDB。 InnoDB 存储引擎是多线程模型,其后台有多个不同的后台线程在运行,负责处理不同异步任务。
2 InnoDB 的后台线程
2.1 Master Thread
master thread 在 innodb 引擎中是一个非常核心的后台线程,主要的任务是把缓冲池中的数据异步刷新到磁盘中,保证数据的一致性,包括脏页的刷新、合并插入缓存(insert buffer)、回滚页(undo)的回收等。Master Thread 具有最高的线程优先级,其内部由多个循环组成,主要内容包括将日志缓冲刷新到磁盘,合并插入缓冲数据,刷新InnoDB 缓冲池中的脏页到磁盘中。
2.2 IO Thread
在InnoDB 存储引擎中大量使用了 AIO(Async IO) 来处理写IO 的请求,这样可以提高数据库的性能。而 IO Thread 的工作主要是负责这些IO 请求的回调处理。InnoDB 数据库引擎中的 IO Thread 有四种类型 write thread(4个) 、 read thread (4个)、 insert buffer(1个) 和 log IO thread(1个) 。
# 查询数据库 innodb 的版本号和读写线程
show variables like "innodb_version"
show variables like "%threads"
show engine innodb status
读写线程的设置如下图所示:
在下图中,可以看到各个线程的 io 线程的线程数量,并且读线程的ID 总是小于写线程:
2.3 Purge Thread
当事务被提交后,其所使用的 undolog 就不再需要了,因此需要 Purge Thread 来回收已经没有作用的回滚页 undo。在 innodb 1.1之前,purge 操作主要由 master 线程完成,在1.1之后将该操作使用独立线程操作,以减轻master 的工作量,从而提高 cpu 的使用率以及提升存储引擎的性能。在 mysql 配置文件中也可以进行设置线程数量:
# 默认的 purge 线程数量已经是4
[mysqld]
innodb_purge_threads=4
2.4 Page Cleaner Thread
该线程是 InnoDB 1.2.x 版本中引入的,其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。其作用主要是减轻 master thread 的工作以及对用户查询线程的阻塞,进一步提高了 InnoDB 存储引擎性能。
3 总结
本文讲述了 innodb 引擎的后台线程的类型,并介绍了相关的作用以及相关的配置情况。