【Mysql高级特性】 初探 InnoDB 体系架构

InnoDB 体系架构

  • 后台线程
  • 内存
    • 缓冲池
      • 缓冲池管理
    • 重做日志缓冲 (redo log buffer)
    • 额外的内存池


后台线程


InnDB存储引擎是多线程模型,不同的线程处理不同的任务。根据任务的不同可以分为以下几种线程

  • Master Thread :Master 线程是一个核心后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性
  • IO Thread : InnoDB存储引擎中大量使用了 AIO 来处理 IO 请求,主要负责 IO 请求的回调处理
  • Purge(清除) Thread :事务提交后,其所使用的 undo log 就不在需要了,因此需要 Purge Thread 回收已经使用并分配 undo 页
  • Page Cleaner Thread : 将之前版本中脏页的刷新操作都放入到单独的线程来完成,为了减轻 Master Thread 的工作对于用户查询线程的阻塞。

内存


缓冲池


InnoDB存储引擎是基于磁盘存储的,由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能

缓冲池简单来说就是一块内存区域,在数据库中进行读取页的操作,通过内存的速度来弥补磁盘速度较慢满对数据库性能的影响。
首先在数据中进行读取页的操作,先将磁盘督导的页存放在缓冲池中,这个过程称为将页 “FIX” 在缓冲池中。 下一次再度相同的页时,首先判断该页是否在缓冲池中,若在缓冲池中,直接读取该页。否则,读取磁盘上的页。

对于数据库中页的修改操作,首先修改在缓冲池中的页,然后在以一定的频率刷新搭配磁盘上,页从缓冲池刷新会磁盘的操作并不是在每次页发生更新时触发。而是通过 ** checkpoint** 的机制刷新回磁盘

缓存池中的数据页类型:

  • 索引页
  • 数据也
  • undo页
  • 插入缓冲页
  • 自适应哈希索引
  • InnoDB存储的锁信息
  • 数据字典信息
    【Mysql高级特性】 初探 InnoDB 体系架构_第1张图片

缓冲池管理

数据库的缓冲池时通过 LRU (Latest Recent Used , 最近最少使用)算法来进行管理的,

与 LRA 不同的是 LRU列表中还加入了midPoint 位置,新读取到的页,虽然是最新访问的页,但并不是直接放入到LRU列表的首部,而是放入到LRU列表的 midPoint 位置。在默认配置之下,该位置在LRU列表长度的 5/8 处。midpoint 之后的列表称为 old 列表 , 之前的列表称为 new 列表 。可以理解为 new 列表中的页是最为活跃的热点数据 。** 如果将直接读取的页放入到LRU列表的首部,那么某些SQL操作可能会使缓冲中的页被刷新出,从而影响缓冲池的效率**。例如索引或数据的草庙操作。这类操作需要访问表中的许多也,甚至是全部的页,而这些页通常是这次查询工作中需要,并不是活跃的热点数据,如果页被放入LRU列表的首部,那么非常可能将所需要的热点数据也从LRU列表中移除。

【Mysql高级特性】 初探 InnoDB 体系架构_第2张图片
为了解决上图中的问题,InnoDB 存储引入了 innodb_old_blocks_time, 用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。

从 InnoDB 1.2 版本开始,可以通过表 INNODB_BUFFER_POOL_STATS 观察缓冲池的运行状态, 还可以通过 INNODB_BUFFER_PAGE_LRU 来观察每个列表中每个页的具体信息。
【Mysql高级特性】 初探 InnoDB 体系架构_第3张图片

【Mysql高级特性】 初探 InnoDB 体系架构_第4张图片
从 InnoDB 1.0.x 开始 支持压缩页的功能,即将原本 16KB 的页压缩未1KB 2kb 4kb 8kb 。 由于也得大小发生了变化,LRU 列表也有了些许改变, 通过 unzip_LRU 列表进行管理。


重做日志缓冲 (redo log buffer)


InnoDB 存储引擎首先将重做日志信息放入到这个缓冲区,然后按照一定频率将其刷新到重做日志问价。一般情况下每一秒会将重做日志缓冲刷新到日志文件, 因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可 。 可以使用配置参数
innodb_log_buffer_size 控制,默认为 8 MB
重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中

  • Master Thread 每一秒将重做日志缓冲刷新到重做日志文件
  • 每个事务提交时会将重做日志缓冲刷新到重做日志文件
  • 当重做日志缓冲池剩余空间小于 1/2 时,重做日志缓冲刷新到重做日志文件

额外的内存池


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

  • 分配了缓冲池(innodb_buffer_pool), 但是每个缓冲池中的帧缓冲(frame buffer)还有对应的缓冲控制对象 (buffer controrl block), 这些对象记录了一下 LRU、锁、等待等信息,而这个对象的内存需要从额外的内存池中申请

你可能感兴趣的:(InnoDB体系架构,mysql,架构)