作者:陌北有棵树,Java人,架构师社区合伙人!


关于MySQL对于后端程序员的重要性不言而喻,而InnoDB也已经是MySQL默认的存储引擎。作为我们每天打交道的存储引擎,我们对它可能需要对它有更多的了解。这样对于很多灵异事件,才能从容应对。

本次文章的内容大部分来自MySQL8.0的官方文档,之所以没有选择现成的资料,而去挑战自己的弱点——英语。是因为最近意识到,学习知识应该到知识的源头,可能最开始会很吃力,但我相信对于后续的技术提升一定是有帮助的。与所有希望在技术上深挖的程序员同胞共勉~

简介

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

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

优势

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

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

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

  • 数据完整性:外键

  • 崩溃恢复

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

  • 外键

  • 校验机制

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

  • 自适应哈希索引

InnoDB架构

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

InnoDB内存架构

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

【一】缓冲池

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

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

技术要点:

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

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

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

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

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

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

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

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

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

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

【二】Change Buffer

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

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

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

【三】自适应哈希索引

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

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

InnoDB磁盘架构

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

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

参考:MySQL官方文档

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?相关推荐

  1. Mysql存储引擎Innodb的读写锁、行级锁

    读写锁 Mysql存储引擎Innodb在处理并发读或者写的时候,通过两种类型的锁来解决并发问题,这两种锁通常称为共享锁和排他锁,也叫读锁和写锁. 读锁是共享的,即多个客户端可以同时读取同一资源. 写锁 ...

  2. mysql dba系统学习(21)mysql存储引擎InnoDB

    mysql存储引擎InnoDB 1,主体系结构: 默认7个后台线程,4个io thread(insert buffer.log.read.write),1个master thread(优先级最高),1 ...

  3. MySQL存储引擎InnoDB,MyISAM

    MySQL存储引擎InnoDB,MyISAM 1.区别: (1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQ ...

  4. 常用Mysql存储引擎--InnoDB和MyISAM简单总结

    常用Mysql存储引擎--InnoDB和MyISAM简单总结 2013-04-19 10:21:52|  分类: CCST|举报|字号 订阅 MySQL服务器采用了模块化风格,各部分之间保持相对独立, ...

  5. mysql存储引擎InnoDB与MyISAM的区别

    mysql存储引擎InnoDB与MyISAM的区别 众所周知,mysql之前的存储引擎是MyISAM,在5.6版本之后默认的存储引擎是InnoDB,那么两个存储引擎有什么区别? 一.MyISAM 存储 ...

  6. MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别

    文章目录 MySQL存储引擎InnoDB.MyISAM和MEMORY介绍详解和区别 InnoDB存储引擎 特点 操作示例 创建InnoDB表 修改表引擎为InnoDB MyISAM存储引擎 特点 操作 ...

  7. MySQL存储引擎InnoDB和MyISAM的区别

    文章目录 前言 一.MySQL 引擎 二.MyISAM和InnoDB特点 三.InnoDB和MyISAM的区别 总结 前言 面试经常会问到MySQL存储引擎的相关内容.常见的MySQL存储引擎有MyI ...

  8. MySQL存储引擎InnoDB架构

    目录 查看MySQL使用的存储引擎 磁盘文件 系统表空间 用户表空间 InnoDB逻辑存储结构 RedoLog文件 内存结构 缓冲池Buffer Pool RedoLogBuffer ChangeBu ...

  9. MySQL存储引擎详解(一)-InnoDB架构

    目录 前言 一.支持的存储引擎 二.InnoDB引擎 1.Buffer Pool 传统LUR算法 预读 预读失效 2.Log Buffer 3.Adaptive Hash Index 4.Change ...

最新文章

  1. mysql删除开放用户权限
  2. 量子不可克隆 计算机,量子不可克隆证明及推理
  3. linux cenots 查看cpu核数
  4. php未登录跳到登陆页面,vue实现未登录跳转到登录页面的方法
  5. mysql悲观锁 更新_MySQL学习笔记(四)悲观锁 for update
  6. 【SpringBoot】【Thyemeleaf 】【Spring EL表达式】 SPEL调用静态类、静态方法
  7. Go 应用性能优化指北
  8. bootstrap .navbar-header 控制button隐藏/显示
  9. 高可用MySQL MHA介绍
  10. 关于telnet的安装
  11. 不知道这十项 Linux 常识,别说自己是运维工程师!
  12. ubuntu php命令行模式,在命令行ubuntu 16.04上切换php版本
  13. psasp 问题记录
  14. 笔记本键盘扣安装注意事项(小技巧)
  15. MRI_Made_Easy 磁共振成像原理-物理基础5
  16. 惠普打印机,打印状态:需要注意,打印时显示:需要用户干
  17. 烽火HG680-MC_TTL免费升级固件及教程
  18. 【MATLAB】MATLAB中format命令的用法
  19. 微信自动加好友可以使用python实现
  20. ios 使用AVFoundation从视频中提取音频

热门文章

  1. poj3304(线段相交问题)
  2. GCD or LCM ---- 处理gcd和lcm同时出现的情况 1499D - The Number of Pairs
  3. 0x17.基础数据结构 - 二叉堆
  4. python生成一个窗口_PyQt5创建一个新窗口的实例
  5. c语言俄罗斯方块注释,C语言学习1年-俄罗斯方块(无注释)
  6. json数组 js html标签,js定义json对象数组 json 数组也是数组 //
  7. JavaScript函数式编程学习
  8. Linux 普通用户之间免密登陆
  9. A-Frame不如x3dom
  10. Owncloud-X安装配置