InnoDB存储引擎体系架构简单介绍

137 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

Mysql最大的特点就是插件式的表存储引擎,存储引擎是基于表的,不是基于数据库的。

InnoDB作为我们现在最常用的存储引擎,下面就简单介绍一下InnoDB存储引擎相关的知识:

InnoDB引擎架构图

后台线程:主要作用是刷新内存池中的数据,保证内存池中的数据是最新的。

后台线程

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

IO Thread:负责IO请求回调,InnoDB1.0版本之前共有四个IO Thread:write、read、insert buffer、log IO Thread

purge Thread:负责回收那些已经使用并且分配的undo页

Page cleaner Thread:原先Master Thread负责脏页刷新,现在由Page cleaner Thread负责,目的:减轻Master Thread阻塞,提高InnoDB性能

内存

缓冲池:为了减轻cpu跟磁盘的读写速度差距,在内存中开辟某些空间来存放数据库里面的数据。

在缓冲池里面修改了的数据,不是每次发生修改就刷新回磁盘,而是通过一种叫CheckPoint的机制刷新回磁盘

缓冲池里面的数据有:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictiontary)

缓冲池管理算法: LRU List、Free List 、Flush List

LRU(Lastest Recent Use):最频繁使用的页放在LRU列表的前端,最少使用放在后端。

算法优化:InnoDB对LRU算法进行了优化,加入了一个midpoint的位置,最新访问的页不直接放在页前端,而是放在LRU列表midpoint中的位置,默认在5/8处,midpoint之前的称为new列表,后面成为old列表

优化原因:防止只查询一次的数据把热点数据筛选下去

LRU列表分配过程:数据库启动的时候LRU列表为空,空闲也放在Free列表,当需要分页的时候,首先会从Free列表中查询有没有空间页,有就从Free列表中拿一个到LRU列表中去,没有就根据LRU算法,淘汰列表末尾的数据,然后再将得到的内存分配给新的页

InnoDB 1.0.x版本之后支持压缩页,压缩过程如下(LRU列表包括unzip_LRU):

例如从缓冲池中申请页面大小为4K的页。

1、检查4k的unzip_LRU,查看时候有4k的空闲页。

2、如果有就分配

3、否则,检查8k的unzip_LRU列表

4、若能得到空闲页,就将页分成2个4k的,放到4k的unzip_LRU列表

5、得不到就申请16k的,然后分成一个8k,两个4k的unzip_LRU

Flush列表:存放脏页。脏页即存放在Flush列表,也存放在LRU列表

Flush和LRU对比:LRU管理缓冲池中页的可用性,Flush列表将脏页刷新回磁盘

Flush列表:存放脏页。脏页即存放在Flush列表,也存放在LRU列表

Flush和LRU对比:LRU管理缓冲池中页的可用性,Flush列表将脏页刷新回磁盘

重做日志缓冲(redo log buffer)

重做日志缓冲:InnoDB引擎将重做日志的信息存放在重做日志缓冲区,然后按一定的频率刷新回日志文件

以下三种情况会将缓冲区日志刷新到磁盘:

1、Master Thread 每秒将重做日志缓冲刷新到重做日志文件

2、每个事务提交会将重做日志缓冲刷新到重做日志文件

3、重做日志缓冲池的剩余空间少于1/2时,重做日志缓冲刷新到重做日志文件

额外内存池

当缓冲池张内存不足的时候,需要向额外内存池申请空间

CheckPoint技术

事务数据库普遍采用Write Ahead log 策列,即当事务提交时,先写重做日志,再修改页(重做日志可恢复数据)

checkpoint技术的目的:

1、缩短数据库恢复时间

2、缓冲池不够用时,将脏页刷新回磁盘

3、重做日志空间不够时,刷新脏页

checkpoint类型:

1、Sharp Checkpoint :在数据库关闭时将所有脏页刷新回磁盘(默认)

2、Fuzzy Checkpoint:数据库运行是,只刷新一部分脏页回磁盘

InnoDB关键特性

1、插入缓冲(Insert buffer)

2、两次写(Double write)

3、自适应哈希(Adaptive Hash Index)

4、异步IO(Aysn IO)

5、刷新邻接页(Flush Neighbor Page)

参考文献:姜承尧- 《MySQL技术内幕:InnoDB存储引擎(第2版)》