携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
一、体系架构
- InnoDB 作为 MySQL 的默认储存引擎,因此我们很要必要对 InnoDB 的体系架构有一定的了解。主要包含了后台线程、内存和文件三个模块。在这里我们将主要关注后台线程和引擎内存相关内容。
二、后台线程
- 后台线程的作用是刷新内存池数据以保证缓存的是最新数据,同时也会将修改的数据刷新到磁盘中,并且在数据库发生异常时 InnoDB 能够恢复到正常状态。
Master Thread
- 这是最核心的后台线程,负责将缓存池中的数据异步刷新到磁盘。例如脏页刷新、合并插入缓存、undo 页回收。
IO Thread
- InnoDB 储存引擎主要使用 AIO (Asyns IO) 处理 IO 请求,以此提高数据库性能,而 IO 线程主要负责 IO 请求的回调,共有四种类型:write、read、insert buffer 和 log IO Thread 。
Purge Thread
- 在事务结束后用来回收 undo 页,能够减轻 Master Thread 的工作,从而提高 CPU 使用率和储存性能。
Page Cleaner Thread
- 将脏页刷新操作放到单独线程中,减轻 Master Thread 工作和用户查询阻塞,提高储存引擎性能。
三、内存
- 缓冲池
- ① InnoDB 是基于磁盘的数据库系统,一般记录按照页的方式进行管理,同时有使用缓冲技术来提高数据库的整体性能。
- ② 缓冲池是一块内存区域,以此通过内存的快速度来解除磁盘慢速度带来的性能限制。
- ③ 页的修改需要刷新回磁盘,而在这里是通过 checkpoint 机制刷新回磁盘的,以此提高数据库整体性能。
- ④ 缓存池数据页类型包括:索引页、数据页、undo 页、插入缓冲、自适应哈希索引、InnoDB 储存锁信息、数据字典信息等。
- ⑤ 每个页通过哈希值平均分配到不同的缓存池实例中,有利于减少内部资源竞争,并且能够增加数据库的并发能力。
- 内存区域管理
- ①
LRU数据库缓存池通过优化的 LRU 算法来管理内存。即在 LRU 列表中加入 midpoint 位置,当有新页面放入 LRU 列表时不是放在首部而是放在 midpoint 处。midpoint 默认为 5/8 。midpoint 之前的称为 new 列表,midpoint 之后的称为 old 列表。new 列表是最活跃的热点数据。 - ② 若有页面从 old 列表部分加入到 new 列表部分,这个过程称为 page made young 。
- ③ 当 LRU 中有页面修改后,就会产生脏页(页和磁盘上的页数据不一致)。LRU 列表用来管理缓存页的可用性,Flush 列表用来管理将页刷新回磁盘。
- 重做日志缓冲
- InnoDB 储存引擎首先将重做日志信息放到该缓冲区,之后再以一定频率刷新到重做日志文件。
- 额外内存池
- 额外内存用于供数据结构本身内存申请分配,当该内存不够时会向缓存池申请内存。