第二章-InnoDB存储引擎

2.1 InnoDB存储引擎概述 17

InnoDB存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和CPU。

2.2 InnoDB存储引擎的版本 18

2.3 InnoDB体系架构 19

首先以一张图简单展示 InnoDB 的存储引擎的体系架构.从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作:

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

2.3.1 后台线程

后台线程的主要作用是负责刷新内存池中的数据,InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。

1.Master Thread

MasterThread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插人缓冲(INSERT BUFFER)、UNDO页的回收等。

2.IO Thread

在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工作主要是负责这些 IO 请求的回调

3.Purge Thread

在事务被提交之后,需要回收 undo 日志文件页,通过这个线程完成。可是设置多个提高效率。

4.Page Cleaner Thread

脏页刷新线程,减轻 master thread 的压力。

2.3.2 内存

1.缓冲池

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

缓冲池的大小直接影响数据库的整体性能。

缓冲池中的数据页有多种类型,索引页和数据页占大部分。

2.InnoDB对缓冲池的管理

LRU:修改缓冲的页,引入 checkpoint 机制,一定规律刷新到磁盘。通过 指定的(非直接加到头部 的)LRU 算法维护主要的索引页与数据页。每个页16KB。之后引入了 压缩页(略,暂时了解)

Free LIst 空闲页列表,Flush List 脏页列表。

重做日志缓冲:redo log buffer,重做日志文件的缓冲。

3.重做日志缓存

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

4.额外的内存池

在对数据结构本身的内存进行分配时,需要从额外的内存池中进行申请。

2.4 Checkpoint技术

当前事务数据库系统普遍都采用了Write Ahead Log策略,即当事务提交时,先写重做日志,再修改页。

checkpoint的工作之一,就是对于内存中的脏页,在一定条件下将脏页刷新到磁盘。checkpoint技术:用于判断何时刷新脏页到磁盘的机制。

Sharp Checkpoint:在关闭数据库的时候,将buffer pool中的脏页全部刷新到磁盘中。
Fuzzy Checkpoint:数据库正常运行时,在不同的时机,将部分脏页写入磁盘,进刷新部分脏页到磁盘,也是为了避免一次刷新全部的脏页造成的性能问题。

2.5 Master Thread工作方式

2.5.1 InnoDB 1.0.x版本之前的Master Thread

2.5.2 InnoDB1.2.x版本之前的Master Thread

2.5.3 InnoDB1.2.x版本的Master Thread

2.6 InnoDB关键特性

2.6.1 插入缓冲

1.Insert Buffer

insert buffer 是物理页,不是在缓冲池中。

当插入数据需要更新非聚集索引时,如果每次都更新则需要进行多次随机IO,因此将这些值写入缓冲对相同页的进行合并提高IO性能。
插入非聚集索引时,先判断该索引页是否在缓冲池中,在则直接插入。否则写入到Insert Buffer对象。

Insert Buffer使用条件:1.索引是辅助索引2.索引不是唯一的

2.Change Buffer

Change Buffer是对前面的Insert Buffer的升级

Change Buffer:包括Insert Buffer、Delete Buffer、Purge Buffer,update操作包括后两个Buffer。

3.Insert Buffer内部实现

Insert Buffer内部是一颗B+树,其也由叶节点和非叶节点组成。非叶节点存放的是
查询的searchkey(键值),其构造如图2-3所示。

4.Merge Insert Buffer

概括地说,Merge Insert Buffer的操作可能发生在以下几种情况下:

  • 辅助索引页被读取到缓冲池时;
  • Insert Buffer Bitmap页追踪到该辅助索引页已无可用空间时;
  • Master Thread。

2.6.2 两次写

提升InnoDB存储引擎的数据页的可靠性。

在应用(apply) 重做日志前,用户需要一个页的副本,当写人失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewrite。在InnoDB存储引擎中
doublewrite的体系架构如图2-5所示。

其刷新脏页步骤如下:

  1. 先将脏页数据复制到doublewrite buffer中(2MB内存)
  2. 将doublewrite buffer分两次,每次1MB写入到doublewrite磁盘(2MB)中。
  3. 马上同步脏页数据到磁盘。对于数据混乱的页则可以从doublewrite中读取到,该页写到共享表空间。

2.6.3 自适应哈希索引

InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带
来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。

2.6.4 异步IO

  • 用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部I0请求发送完毕后,等待所有IO操作的完成,这就是AIO。
  • 可以进行IO Merge操作,即将多个IO合并为一个IO,从而使随机IO变顺序IO 。

2.6.5 刷新邻接页

刷新页时判断相邻页是否也是脏页。

2.7 启动、关闭与恢复

2.8 小结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值