了解InnoDB体系结构

本文深入探讨InnoDB存储引擎的内存池、重做日志缓冲、额外内存池等核心组件,以及CheckPoint、异步IO、刷新临接页等关键技术特性。

InnoDB存储引擎具有行锁设计、支持事务、支持外键、支持MVCC、支持插入缓冲、支持自适应哈希索引等特点,其整体体系架构主要由后台线程、内存池、文件系统三部分组成,如下图所示:

tu1

接下来会针对内存池展开介绍。

(一)内存池

内存池从大的方面可以分为三块:重做日志缓冲(redo log buffer)、缓冲池(buffer pool)、额外内存池(additional memery pool)。缓冲池中缓存的数据页类型有:数据页(data page),索引页(index page)、插入缓冲(insert buffer)、锁信息(lock info)、自适应哈希索引(adaptive hash index)、数据字典(data dictionary)、undo页等。缓冲池从1.0.X版本开始,允许有多个实例,根据哈希值将每个页平均分配到不同的实例中。

tu2

(Ⅰ)缓冲池

Innodb是基于磁盘存储的数据库,CPU速度和磁盘速度之间存在巨大的鸿沟,磁盘速度较慢严重降低了数据库系统的性能。基于这个问题,数据库在内存中开辟了一块区域作为缓冲池来弥补两者之间的速度差距。在数据库中读取页时,首先将从磁盘读到的页放在缓冲池中,下次再读相同的页时,首先判断该页是否在缓冲池中,若命中则直接读取该页,否则从磁盘上读取。

① LRU列表

缓冲池通过LRU(Latest Recent Used,最近使用)算法来进行管理页(数据页、索引页),最频繁使用的排在LRU列表前端,反之,排在末端。当缓冲池不能存放新读取到的页时,首先释放LRU列表末端的页。

Innodb在LRU算法上做了一些调整。一些的一次性读取大量页的SQL操作会将缓冲池中的页大量刷出,从而影响缓冲池的效率(页缓冲池缓存频繁使用页的初衷不符)。为了解决这个问题,Innodb在LRU算法上引入了midpoint概念,midpoint点将LRU列表一分为二,LRU列表前端至midpoint点为new列表,midpoint点至LRU列表末端为old列表new列表old列表各自都以LRU算法管理,新读取的页被加入old列表,只有在old列表中存活一定时间(innodb_old_blocks_time)以后才会被加入new列表,可以看出new列表中的页都是最为活跃的热点数据。midpoint默认值是37%,即默认old列表占完整LRU列表的37%,由参数innodb_old_blocks_pct控制。

tu3

LRU列表中存储的页数上限是确定的,Innodb引入了Free列表来与LRU列表共同管理,未分配的页由Free列表进行管理,Free列表当前页数加LRU列表当前页数等于LRU列表可容纳的总页数。新读取页时,首先从Free列表中查找是否有空闲页,若有则将空闲页从Free列表移到LRU列表中,否则根据规则淘汰LRU列表末尾的页。

InnoDB中页的大小是16KB,InnoDB从1.0.X开始,支持压缩页功能,可以将部分页压缩为1KB、2KB、4KB、8KB,对于非16KB的页,使用unzip_LRU列表管理。如需要申请4KB大小的页时,通过伙伴算法进行分配,过程如下:

  1. 检查4KB的unzip_LRU列表,检查
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值