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