InnoDB存储引擎

InnoDB是事务安全的MySQL存储引擎,设计上采用了类似Oracle数据库的架构。通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎。

一、InnoDB存储引擎的版本

版本功能
老版InnDB支持ACID、行锁设计、MVCC
InnoDB 1.0x继承上版本所有功能,增加compress、dynamic页格式
InnoDB 1.1x继承上版本所有功能,增加Linux AIO、多段回滚
InnoDB 1.2x继承上版本所有功能,增加全文索引支持、在线索引添加

二、InnoDB体系结构

InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:

  • 维护所有线程/线程需要访问的多个内部数据结构
  • 缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存
  • 重做日志(redo log)缓冲
  • ……
InnoDB存储引擎体系架构

后台线程主要作用是负责刷新内存池中数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

1)后台线程

InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。

  1. Master THread:一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER)、UNDO页的回收
  2. IO Thread:主要是负责InnoDB中大量的AIO(Async IO)请求的回调(call back)。Linux下的IO Thread数量不能调整。
  3. Purge Thread:用来回收undo页,1.1版本之后purge操作可以独立到单独的线程中进行。1.2之后,InnoDB支持多个Purge Thread。
  4. Page Cleaner Thread:1.2.x版本中引入,作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。
2)内存

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此,可将其视为基于磁盘的数据库系统(Disk-base Database)。

  1. 缓冲池:缓冲池简单来说就是一块内存区域,用来缓解内存和磁盘速度差异问题。其对数据库的进行读取页、修改页的操作类似于操作系统中cache读取的操作。缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)等。
  2. LRU LIST、Free List和Flush List:缓冲池是通过LRU(Latest Recent Used,最近最少未使用)算法来进行管理的。数据库刚启动时,页都存放在Free列表;LRU列表用来管理已经读取的页;Flash列表中的页为脏页列表,Flash列表用来管理将页面刷新回磁盘。脏页既存在于LRU表,又存在于Flash表。
  3. 重做日志缓冲:一般情况下,Master Thread每一秒中会将重做日志缓冲刷新到日志文件;每个事务提交时会将重做日志缓冲刷新到重做日志文件;当重做日志缓冲池剩余空间小于50%时,重做日志缓冲刷新到重做日志文件。
  4. 额外的内存池:InnoDB存储引擎中,对内存的管理是通过内存堆(heap)的方式进行的。在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域内存不足时,会从缓冲池中进行申请。

三、InnoDB关键特性

InnoDB关键特性包括:

  • 插入缓冲(Insert Buffer)
  • 两次写(Double Write)
  • 自适应哈希索引(Adaptive Hash Index)
  • 异步IO(Async IO)
  • 刷新邻接页(Flush Neighbor Page)

发表评论

邮箱地址不会被公开。 必填项已用*标注