InnoDB 体系结构
  xwGmYGXf1w4S 2023年11月13日 30 0

下图是InnoDB 存储引擎体系结构的内存与磁盘结构

InnoDB 体系结构_缓冲池

1.后台线程

1.1 Master Thread

主要负责将缓存池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、undo 页的回收等。

1.2 IO Thread

在InnoDB 存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以大大提高数据库的性能。而IO Thread 主要负责IO 请求的回调处理。

1.3 Purge Thread

事务提交后,其所使用的undolog 可能不再需要,因此需要Purge Thread 来回收,已经使用并分配的undo 页。

1.4 Page Cleaner Thread

其作用是将之前版本中脏页的刷新操作放到单独的线程中来完成。其目的是为了减轻原Master Thread 的工作及对于用户查询线程的阻塞,进一步提高InnoDB 存储引擎的性能。

2.内存

InnoDB 体系结构_重做日志_02

2.1 缓冲池

InnoDB 存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。在数据库系统中由于cpu 速度与磁盘之间的鸿沟,基于磁盘的数据库系统通常使用缓冲技术来提高数据库的整体性能。

缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库的影响。

具体来看,缓冲池中缓存的数据页类型有:数据页,插入缓冲、锁信息、索引页、自适应哈希索引、数据字典等。

2.2 重做日志缓冲

InnoDB 存储引擎首先将重做日志信息放入到重做日志缓冲区,然后按照一定的频率将其刷新到重做日志文件。

在下列三种情况下会将重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中:

  1. Master Thread 每过一秒
  2. 每个事务提交时
  3. 当重做日志缓冲池剩余空间小于 1/2 时

2.3额外的内存池

在 InnoDB存储引擎中,对内存的管理是通过一种称为内存堆的方式进行的。在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。

3.Checkpoint 技术

如果每次一个页发生变化,就将新页的数据刷新到磁盘,那么这个开销是非常大的;若热点数据集中在某几个页中,那么数据库的性能将会变得非常差;同时如果在从缓冲池将页的新版本刷新到磁盘是发生宕机,那么数据就不能恢复了。故而当前的事务数据库系统普遍采用了 write ahead log 策略,即事务提交时,先写重做日志,再修改页。

数据库中的缓冲池是不能缓存数据库中所有的数据的,重做日志也不能无限增大。Checkpoint 技术的目的就是为了解决下述几个问题:

  1. 缩短数据库的恢复时间
  2. 缓冲池不够用时,将脏页刷新到磁盘
  3. 重做日志不可用时,刷新脏页

在 InnoDB引擎中,有两种 Checkpoint:

  1. Sharp Checkpoint(发生在数据库关闭时刷新所有脏页)
  2. Fuzzy Checkpoint (数据库运行时刷新部分脏页)

4.InnoDB 关键特性

InnoDB存储引擎的关键特性包括:

  1. 插入缓冲
  2. 两次写
  3. 自适应哈希索引
  4. 异步IO
  5. 刷新邻接页

4.1 插入缓冲

InnoDB存储引擎开创性地设计了插入缓冲,对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,直接插入;若不在,则先放入到一个 Insert Buffer 对象中。

使用插入缓冲需要同时满足以下两个条件:

  1. 索引是辅助索引
  2. 索引不是唯一的

4.2 两次写

InnoDB 体系结构_存储引擎_03

在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过 memcpy 函数将脏页先复制到内存中的 doublewrite buffer,之后再将其分两次,一次写到共享表空间,一次写到数据文件,而当数据文件损坏时,从共享表空间中取出写入的脏页进行恢复。

4.3自适应哈希索引

InnoDB存储引擎会自动根据访问的频率和模式来自动低为某些热点页建立哈希索引。自适应哈希索引有一个要求,即对这lingj个页的连续访问模式必须是一样的。

4.4异步IO

采用异步IO,可以提高磁盘操作性能。异步IO就是用户可以在发出一个请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成。

异步IO还有一个优势就是可以对多个IO进行合并操作。如果异步IO判断到多个IO请求的页是连续时,那么就会合并成一个IO操作,而不需要使用多次操作。

4.5刷新邻接页

当刷新一个脏页时,InnoDB存储引擎会检测该页所在区的所有页,如果是脏页,那么一起进行刷新。其实也就是通过异步IO将多个IO操作合并成一个IO操作。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
xwGmYGXf1w4S