一、概述
首先,InnoDB是是一个事务安全的MySQL存储引擎,这是它与MyIsAM的最大区别,也已经成为了MySQL的默认存储引擎。InnoDB存储引擎的主要架构如下图,由许多的后台线程,内存池以及文件组成,这些内存块构成了一个大的内存池
1.1内存结构
1.2内存池的主要工作
- 维护所有进程/线程需要访问的多个内部数据结构
- 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存
- 重做日志(redo log)缓冲
- … …
二、 后台线程
不同的后台线程负责不同的任务。
2.1 Master Thread
听名字就知道是核心后台线程,负责如下内容:
- 缓冲池数据异步刷新到磁盘
- 保证数据的一致性
2.2 IO Thread
InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,IO Thread 的主要职责是:
- 负责这些 IO请求的回调处理
2.3 Purge Thread
事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread来回收已经使用并分配的 undo 页。它做的也是清理工作。InnoDB支持多个Purge Thread,这样做的目的是为了进会步加快 undo 页的回收
2.4 Page Cleaner Thread
Page Cleaner Thread是在 InnoDB 1.2.x版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原 Master Thread的工作及对于用户查询线程的阻塞,进一步提高 InnoDB存储引擎的性能。
三、 内存
3.1 缓冲池
速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。缓冲池能为读取和写入带来性能上的极大提升。缓冲池的大小直接影响着数据库的整体性能。
3.1.1 读取时
在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页"FIX"在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。
3.1.2 写入时
对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。这里需要注意的是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为 Checkpoint 的机制刷新回磁盘
3.1.3 缓冲池缓存的数据页类型
索引页、数据页、undo 页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)等
3.1.4 缓冲池的管理
- LRU Lis
- Free List
- Flush List
3.2 重做日志缓冲
InnoDB存储引擎首先将重做日志信息先放入到这个缓冲区,然后按一定频率将其刷新到重做日志文件。重做日志缓冲一般不需要设置得很大,因为一般情况下每一秒钟会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可
触发重做日志缓冲中的内容刷新到外部磁盘的重做日志文件的情况:
- Master Thread每一秒将重做日志缓冲刷新到重做日志文件
- 每个事务提交时会将重做日志缓冲刷新到重做日志文件
- 当重做日志缓冲池剩余空间小于 1/2 时,重做日志缓冲刷新到重做日志文件
3.3 额外的内存
对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请
四 checkpoint技术
Checkpoint(检查点)技术的目的是解决以下几个问题:
- 缩短数据库的恢复时间
- 缓冲池不够用时,将脏页刷新到磁盘
- 重做日志不可用时,刷新脏页
在InnoDB存储引擎内部,有两种Checkpoint:
- Sharp Checkpoint
- Fuzzy Checkpoint
在InnoDB存储引擎中可能发生如下几种情况的Fuzzy Checkpoint:
- Master Thread Checkpoint
- FLUSH_LRU_LIST Checkpoint
- Async/Sync Flush Checkpoint
- Dirty Page too much Checkpoint
五、InnoDB关键特性
- 插入缓冲
- 两次写
- 自适应哈希索引
- 异步 IO
- 刷新邻接页
六、 总结
【参考】
【1】《MySQL技术内幕 InnoDB存储引擎 第2版》