MySQL InnoDB存储引擎简述

1. MySQL数据库体系结构

MySQL体系结构

  • MySQL向外提供的交互接口:Connectors组件是MySQL向外提供的交互组件,如java,.net,php等语言可以通过该组件来操作SQL语句,实现与SQL的交互
  • 连接池组件:缓冲已建立的连接,通过该连接客户端与MySQL Server端的通信
  • 管理服务和工具组件:系统管理和控制工具, 提供对MySQL的集成管理,例如备份恢复、Mysql复制、集群等
  • SQL接口组件:接受用户的SQL命令,并且返回用户需要查询的结果
  • 查询分析器组件:对SQL命令进行验证和解析,若失败,则提示SQL语句不合理
  • 优化器组件:在执行SQL命令前,对查询进行优化,使用“选取-投影-联接”策略
  • 缓冲(cache)组件:缓存之前的查询结果,若查询语句在缓存中命中的结果,直接在缓存中获取数据
  • 插件式存储引擎:MySQL数据库区别与其他数据库的重要特点,不同的存储引擎有不同管理操作数据的方法。存储引擎基于表而不是基于数据库的,所以也可以称为表类型
  • 物理文件:日志文件、数据文件、配置文件、pid文件、socket文件等

2. MySQL存储引擎

MySQL插件式存储引擎

3. InnoDB存储引擎

3.1 体系架构

InnoDB存储引擎体系架构(摘自MySQL技术内幕)

  • 内存池:用于维护所有进程/线程需要访问的多个内部数据结构,缓存磁盘上的数据及重做(redo log)日志等
    InnoDB内存数据对象(摘自MySQL技术内幕)

    • 由于CPU与磁盘速度之间的鸿沟,需要缓冲池来提高数据库的整体性能。进行读取操作时,首先判断需要的页在不在缓冲池中,在则直接读取,不在,则从磁盘中读取并将从磁盘中的页存放在缓冲池中。进行修改操作时,首先修改缓存池中的页,再以一定的频率刷新到磁盘上
    • 使用Checkpoint技术将缓冲池中的脏页刷回到磁盘,当数据库发送宕机后,只需要对Checkpoint后的重做日志进行恢复
  • 后台线程:InnoDB存储引擎为多线程模型,由多个后台线程负责不同的任务,刷新内存池中的数据

    • Master Thread:负责将缓存池中的数据(日志)异步刷新到磁盘,保证数据的一致性
    • IO Thread:负责IO请求的回调处理
    • Purge Thread:回收已经使用并分配的undo页
    • Page Cleaner Thread:刷新缓冲池中的脏页

3.2 InnoDB关键特性

3.2.1 插入缓冲
  • 使用场景
    当一张表中有非唯一辅助索引时,进行插入操作,数据页的存放还是按照主键的顺序存放,但是对于非聚集索引的子节点的插入不再是顺序的了,需要离散地访问索引页,从而导致插入性能下降。所以InnoDB对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先进行判定,若非聚合的索引页在缓冲池,则直接插入,若不在,先放入到一个Insert Buffer对象中,然后再以一定的频率和情况进行合并,多个插入合并到一个操作(因为在一个索引页中),从而大大提升了插入的性能。
  • 内部结构
    Insert Buffer的数据结构是一颗B+树
    在这里插入图片描述
    在这里插入图片描述
  • Insert Buffer Bitmap页
    目标:保证每次合并插入缓冲成功
    标记每个辅助索引页的可用空间,每个辅助索引页的信息在Insert Buffer Bitmap页中占4位(bit)
    在这里插入图片描述
  • 合并
    插入缓冲的合并操作会发生在以下三种情形:
  1. 辅助索引页被读取到缓冲池,会首先检查Insert Buffer Bitmap页来确定该辅助索引页是否有记录存放在Insert BufferB+树中,如果有,会进行合并
  2. Insert Buffer Bitmap页追踪每个辅助索引页的可用空间,若插入记录后可用空间会小于1/32页的空间,会执行一次合并操作
  3. Master Thread定时执行合并操作
3.2.2 两次写

通过重做日志对页进行恢复操作时,为防止这个页本身已经发生损害,用户需要一个页的副本,当发生写入失效时,先通过该页的副本来还原该页,再进行重做,这就是两次写。两次写保证了数据的可靠性。
二次写

3.2.3 自适应哈希索引

在生产环境中,B+树的高度一般为3~4层,需要3到4次的查询,而哈希查找的时间复杂度为O(1),所以Innodb存储引擎如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,称之为自适应哈希索引(AHI)。

3.2.4 异步IO(AIO)

InnoDB存储引擎允许用户在发出一个IO请求后,可以立即再发出另一个IO请求,当所有的IO请求发完后,等待所有IO操作的完成。

3.2.5 刷新邻接页

当刷新一个脏页的时候,Innodb存储引擎会检测该页所在区的所有页,如果是脏页就一起刷新。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值