MySQL InnoDB体系架构

本文将介绍 MySQL 中 InnoDB 存储引擎的体系架构。

一、后台线程

InnoDB 存储引擎是多线程的,其后台由多个不同的线程,负责不同的任务,其中:

  • Master Thread:最核心线程,主要负责将缓冲池中的数据异步刷新到磁盘中,保证数据一致性,包括脏页的刷新、合并插入缓存、UNDO 页的回收等

  • IO Thread:在 InnoDB 存储引擎中大量使用了异步 IO,从而提升了性能。IO Thread 的工作是负责这些异步 IO 的回调处理

  • Purge Thread:Purge Thread 用于回收 undolog

    • undolog 记录更改前的状态,可以用于回滚、撤销、还原
    • 当并发操作结束、事务完成后,undolog 不再需要,此时便需要进行回收操作
    • 在 InnoDB 1.1 版本之前,Purge Thread 并不存在,回收工作由 Master Thread 完成
    • 在 InnoDB 1.1 版本后,可以修改配置文件开启 Purge Thread,使得回收操作由独立的 Purge Thread 进行
    • 在 InnoDB 1.2 版本后,InnoDB 支持多个 Purge Thread,从而可以进一步加快 undolog 的回收
  • Page Cleaner Thread:在 InnoDB 1.2.X 版本后引入,其作用的处理脏页的刷新操作

    • 在此之前,脏页的刷新操作由 Master Thread 处理

二、内存池

1. 说明

内存池的主要工作是:

  • 维护需要使用的多个内部数据结构
  • 缓存磁盘上的数据,方便读取
  • 缓存对磁盘数据的修改
  • 重做日志缓存

内存池主要可以分为以下部分:

在 MySQL 5.5 之前,只有插入缓存(insert buffer);

在 MySQL 5.5 之后,插入缓存被扩展,现在它叫做修改缓存(change buffer),可以优化 INSERT、DELETE、UPDATE。

2. 缓冲池

缓冲池就是一块内存区域,以 “缓冲” 的方式弥补磁盘速度较慢对数据库性能的影响。

3. redo 日志缓冲

redo 日志会先写入该缓冲区,然后按一定频率刷新到重做日志文件。

redo 日志缓冲一般不需要设置得很大,因为一般情况下每秒钟会将重做日志缓冲刷回到日志文件。

4. 额外内存池

对 InnoDB 内部使用的数据结构对象进行管理。

参考

  • MySQL 技术内幕
  • MySQL 实战 45 讲
  • MySQL 是怎样运行的:从根儿上理解 MySQL