MySql(一) InnoDB存储引擎

一.InnoDB体系架构

InnoDB的总体结构主要由三部分组成:负责各个功能的线程,介于线程与磁盘间的内存缓冲(用于提高数据库允许速度),存于磁盘的文件。

   

 

二.MySql后台线程

2.1 MasterThread

MasterThread是核心线程,具有最高线程优先级,主要负责数据异步刷新到磁盘,包括:脏页的刷新、插入缓冲的合并、UNDO页的回收。MasterThread线程中有四种内部循环,分别为:主循环loop、后台循环backgroup loop、刷新循环flush loop、暂停循环suspend loop。每种循环分别在不同情况下运转,负责执行不同的任务。

【注】:undo页用于存放修改数据时被修改前的数据。对表进行Update、Deleta等操作时,由于一致性读的原因,需要保存这些行各个版本的信息在undo页中。

2.1.1)主循环 loop

该循环的主要任务是:脏页刷新、日志缓冲刷新、无用undo页的删除、插入缓冲的合并至辅助索引页。循环会每秒和每10秒依据情况进行以上操作。

每秒操作如下:

  • 将重做日志缓冲刷新到磁盘,即使该事务还未提交。(总是)
  • 刷新innodb_io_capacity(默认值为200)个脏页至磁盘。(缓冲池中脏页比例超过了配置文件中的innodb_max_dirty_pages_pct)
  • 合并Insert Buffer至辅助索引页。(前一秒的IO次数小于5次)
  • 若当前没有用户活动,则切换到backgroup loop。

每10秒操作如下:

  • 根据IO决定是否刷新一定数量的脏页至磁盘。(前10秒的IO次数小于200)
  • 合并一些Insert Buffer至辅助索引页。(总是)
  • 将重做日志缓冲刷新到磁盘。(总是)
  • 删除无用的Undo页。(总是,自InnoDB1.1版本开始,undo页回收操作交由PurgeThread线程处理,)
  • 根据脏页占比决定刷新多少脏页至磁盘中。(脏页比例超过buf_get_modified_radio_pct则刷新100个,否则刷新10个)

 

2.1.2)后台循环 background loop

当没有用户活动(数据库空闲)时或数据库关闭(shutdown),便会切换到该循环。该循环主要执行以下操作:

  • 删除无用的Undo页。(总是)
  • 合并Insert Buffer至辅助索引页。(总是)
  • 跳回主循环(总数)
  • 跳转至flush loop中刷新100个页,直至符合条件。

2.1.3)刷新循环 flush loop

刷新一定数量的脏页到磁盘中。

2.1.4)暂停循环 suspend loop

将MasterThread挂起,等待时间发生。

 

三.内存缓冲

3.1 缓冲池

为了平衡CPU的处理速度与磁盘读写速度间的不匹配,mySql会将磁盘上的物理页读取到内存中,以此提高数据库的整体性能。自InnoDB1.0.x起,mySql允许创建多个缓冲池实例,这增加了数据库的并发处理能力。

3.1.1)数据页缓冲的管理

数据页缓冲用于存放那些存储数据的物理页,mySql通过三种链表来管理这些内存。

(1)LRU List

LRU(Latest Recent Used 最近最少使用) List用于管理那些最近读取的页。那些最频繁使用的页在LRU List的前端,最少使用的页在LRU List的尾端。为了防止由于索引和数据扫描操作时读入大量页,导致的热点数据页被移除,mySql对传统LRU算法进行了改进。

在传统LRU链表上,增加了一个midPoint点,该点所在位置由参数innodb_old_blocks_pct控制。对于新读取的页将被现添加到链表的midPoint位置,并在参数innodb_old_blocks_times指定的时间后,加入到LRU的热点列表(即LRU链表midPoint之前的位置)。

(2)Free List

Free List用于管理空闲页。

(3)Flush List

用于管理脏页,因此也称为脏页列表。

3.2 重做日志缓冲

InnoDB存储引擎将重做日志信息先写入重做日志缓存中,之后再以一定频率刷新至重做日志文件(重做日志的内容应该类似于Redis的AOF文件)。重做日志文件是循环使用的,而非无限增大,可以被循环利用的部分是指当数据库发生宕机需要恢复时,不需要的那部分日志。

【注】:Innodb通过日志序列号LSN(Log Sequence Number)来完成日志的循环利用,LSN记录了写入日志的字节总量,在日志文件、CheckPoint和页都有LSN的记录指。通过刷新回磁盘的最新页LSN和已经写入日志的LSN,可以知道日志文件哪一部分是有用的

3.2.1)CheckPoint技术

 

3.3 插入缓冲

数据库中的非聚集索引是使用B+树实现的,这就导致了在非聚集索引中进行索引插入时,会离散访问索引页。但辅助索引在逻辑上是顺序的,因此其插入也是比较顺序的(比如已时间字段为索引)。

为了解决离散访问带来的效率问题,InnoDB引入了插入缓冲,对于非聚集索引的插入或更新操作,不是每一次都直接插入到索引页中,而是先判断索引页是否在内存缓冲中,若在则直接插入,否则先放入插入缓冲。之后再以一定频率进行插入缓冲与辅助索引页子节点的合并。这样往往可以将多次操作合并到一次对物理页的访问中去。

【注】:InnoDB从1.0.x版本开始引入了Change Buffer。该缓冲会用于缓存DML操作——INSERT、DELETE、UPDATE操作进行缓冲。ChangeBuffer适用的对象依然是非唯一辅助索引。

3.3.1)Insert Buffer的内部实现

B+树

 

四.效率与可靠性的其它措施

4.1 两次写(DoubleWrite)

 

4.2 自适应哈希索引(AHI)

 

4.3 刷新邻接页

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值