温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Mysql存储引擎InnoDB两种架构介绍

发布时间:2020-05-18 15:37:16 来源:网络 阅读:272 作者:三月 栏目:编程语言

下面一起来了解下Mysql存储引擎InnoDB两种架构,相信大家看完肯定会受益匪浅,文字在精不在多,希望Mysql存储引擎InnoDB两种架构这篇短内容是你想要的。

首先来看官方文档对InnoDB的解释:

InnoDB是一个平衡了高可用和高性能的通用存储引擎。

优势

  • 保护用户数据:DML操作,通过事务来遵循ACID模型

  • 高性能:行级锁,一致性读取

  • 最小化主键查找的IO:聚簇索引

  • 数据完整性:外键

  • 崩溃恢复

  • 在主内存缓存索引数据和缓存表

  • 外键

  • 校验机制

  • 只要你在设计表时选择了合适的主键,主键列where、order by、group by、join操作会被自动优化

  • 自适应哈希索引

InnoDB架构

InnoDB的整体架构可以分为两个部分:内存架构、磁盘架构


Mysql存储引擎InnoDB两种架构介绍

InnoDB内存架构

InnoDB在内存中主要包括下面几个部分:缓冲池、Change缓冲区、自适应哈希索引、Log缓冲区

【一】缓冲池

简介: 存储访问时的缓存表和索引数据。在专用云服务器上,通常会为缓冲池分配80%的物理内存

作用: 可以快速从内存获取数据,加快了处理速度。

技术要点:

Page:为了high-volume的读取效率,缓冲池进一步被分为页的结构。

LRU:为了缓存的管理效率,缓冲池实现page间的链表,使用LRU算法。缓冲池使用调整后的LRU(最近最少使用)算法,当需求添加新的page时,最近最少使用的page被清除,同时新页面被添加到链表的中间部分

这种中间点插入的策略,把链表分为两个子链表

  • 头部:最近被访问过的“年轻”页

  • 尾部:最近被访问的old page

这样使新子列表中保存更重要的page,旧子列表包含较少使用的page,这部分page是被清除的候选page


Mysql存储引擎InnoDB两种架构介绍

默认情况下,算法配置如下:

  • 旧子列表:缓冲池的3/8

  • midpoint(中间点)是新子列表尾部和旧子列表头部的交界

  • 当旧页被访问,会被移动到缓冲池的头部,随着数据库的运行,一直没有被访问的页会一直后移,直至最后被移除。

【二】Change Buffer

Change Buffer是一种特殊的数据结构,当某些页面不在缓冲池中,缓存会改变二级索引page,这可能会造成insert,update,delete(DML)操作会与其他从缓冲池中的读操作加载的page合并。


Mysql存储引擎InnoDB两种架构介绍

不同于聚簇索引,二级索引通常不唯一,同时二级索引的插入相对随机。

同时,为了避免频繁的IO随机读写,当更新和删除操作时,并不会立即写入磁盘,而是会选择系统空闲时定期进行写入磁盘的操作。Change Buffer在内存中,是缓冲池中的一部分,在磁盘中,是系统表空间的一部分。

【三】自适应哈希索引

简介: InnoDB可以基于搜索的模式,使用索引键前缀构建哈希索引,也就是说,这个哈希索引是由经常访问的索引页面构建的。

作用: 在不牺牲事务特性和可靠性的基础上,使InnoDB像一个内存数据库一样工作,也就是说在一定情况下,通过这种哈希索引的方式会提升查询速度。InnoDB中存在一种监视索引搜索的机制,但这种机制有时反倒带来额外的开销。所以在选择是否使用哈希索引前,可能需要做好基准测试,否则还是建议禁用。

InnoDB磁盘架构

通过上面的整体架构图可以看到,InnoDB在磁盘中存储的信息包括:各种表空间(TableSpace),Redo Log。

InnoDB对数据存储方式的设计,主要是基于表空间的形式。表空间的种类如下图所示:

Mysql存储引擎InnoDB两种架构介绍

使用InnoDB表的限制,来自MySQL官方文档,感觉有些还是挺有趣的,但可能实际场景中并不会用到:

  1. 一个表最多包含1017列,表示并没有创建过这样多列的表

  2. 一个表最多可以创建64个二级索引

  3. 索引键前缀长度限制为3072字节

Undo Log 和 Redo Log

这里还有两个Log区域需要关注一下:

Undo Log

Undo Log是与事务读写关联的,主要作用在事务回滚和多版本并发控制中。

Undo Log在回滚段中存储,回滚段在Undo表空间和全局临时表空间中。Undo log被分为insert undo log 和update undo log。Insert undo log 只在事务回滚时需要,一旦事务提交就被丢弃。Update undo log 也被用在一致性读,在一致性读中可能需要update undo log的信息来生成该行数据早期的版本。

关于undo log的建议

定期地提交事务,包括哪些只包含一致性读的事务,否则,InnoDB不会丢弃update undo log中的数据,回滚段会变得越来越大,占满空间。undo log中回滚段的物理空间,通常小于相应插入或更新的行,可以利用这个信息计算回滚段需要的空间

Redo Log

也就是ib_logfile0和ib_logfile1两个文件

这里结合的是MySQL的WAL(Write-Ahead Logging)也就是先写日志,再写磁盘,具体过程是下面这样:当有一条记录要更新,先将记录写到redo log,并更新内存,InnoDB会在空闲的时候,把操作记录更新到磁盘。

官方建议的最佳实践

  • 指定主键

  • 外键

  • 关闭自动提交

  • DML的事务进行分组

  • 不要用lock table,如果希望某行的独占写,用 select … for update

  • 启用innode_file_per_table

点击获取 附送学习进阶架构资料、PDF书籍文档、面试资料

Mysql存储引擎InnoDB两种架构介绍

Mysql存储引擎InnoDB两种架构介绍

看完Mysql存储引擎InnoDB两种架构这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的行业资讯栏目。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI