你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?
作者:陌北有棵树,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官方文档,感觉有些还是挺有趣的,但可能实际场景中并不会用到:
一个表最多包含1017列,表示并没有创建过这样多列的表
一个表最多可以创建64个二级索引
索引键前缀长度限制为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分为内存架构、磁盘架构?相关推荐
- Mysql存储引擎Innodb的读写锁、行级锁
读写锁 Mysql存储引擎Innodb在处理并发读或者写的时候,通过两种类型的锁来解决并发问题,这两种锁通常称为共享锁和排他锁,也叫读锁和写锁. 读锁是共享的,即多个客户端可以同时读取同一资源. 写锁 ...
- mysql dba系统学习(21)mysql存储引擎InnoDB
mysql存储引擎InnoDB 1,主体系结构: 默认7个后台线程,4个io thread(insert buffer.log.read.write),1个master thread(优先级最高),1 ...
- MySQL存储引擎InnoDB,MyISAM
MySQL存储引擎InnoDB,MyISAM 1.区别: (1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQ ...
- 常用Mysql存储引擎--InnoDB和MyISAM简单总结
常用Mysql存储引擎--InnoDB和MyISAM简单总结 2013-04-19 10:21:52| 分类: CCST|举报|字号 订阅 MySQL服务器采用了模块化风格,各部分之间保持相对独立, ...
- mysql存储引擎InnoDB与MyISAM的区别
mysql存储引擎InnoDB与MyISAM的区别 众所周知,mysql之前的存储引擎是MyISAM,在5.6版本之后默认的存储引擎是InnoDB,那么两个存储引擎有什么区别? 一.MyISAM 存储 ...
- MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别
文章目录 MySQL存储引擎InnoDB.MyISAM和MEMORY介绍详解和区别 InnoDB存储引擎 特点 操作示例 创建InnoDB表 修改表引擎为InnoDB MyISAM存储引擎 特点 操作 ...
- MySQL存储引擎InnoDB和MyISAM的区别
文章目录 前言 一.MySQL 引擎 二.MyISAM和InnoDB特点 三.InnoDB和MyISAM的区别 总结 前言 面试经常会问到MySQL存储引擎的相关内容.常见的MySQL存储引擎有MyI ...
- MySQL存储引擎InnoDB架构
目录 查看MySQL使用的存储引擎 磁盘文件 系统表空间 用户表空间 InnoDB逻辑存储结构 RedoLog文件 内存结构 缓冲池Buffer Pool RedoLogBuffer ChangeBu ...
- MySQL存储引擎详解(一)-InnoDB架构
目录 前言 一.支持的存储引擎 二.InnoDB引擎 1.Buffer Pool 传统LUR算法 预读 预读失效 2.Log Buffer 3.Adaptive Hash Index 4.Change ...
最新文章
- mysql删除开放用户权限
- 量子不可克隆 计算机,量子不可克隆证明及推理
- linux cenots 查看cpu核数
- php未登录跳到登陆页面,vue实现未登录跳转到登录页面的方法
- mysql悲观锁 更新_MySQL学习笔记(四)悲观锁 for update
- 【SpringBoot】【Thyemeleaf 】【Spring EL表达式】 SPEL调用静态类、静态方法
- Go 应用性能优化指北
- bootstrap .navbar-header 控制button隐藏/显示
- 高可用MySQL MHA介绍
- 关于telnet的安装
- 不知道这十项 Linux 常识,别说自己是运维工程师!
- ubuntu php命令行模式,在命令行ubuntu 16.04上切换php版本
- psasp 问题记录
- 笔记本键盘扣安装注意事项(小技巧)
- MRI_Made_Easy 磁共振成像原理-物理基础5
- 惠普打印机,打印状态:需要注意,打印时显示:需要用户干
- 烽火HG680-MC_TTL免费升级固件及教程
- 【MATLAB】MATLAB中format命令的用法
- 微信自动加好友可以使用python实现
- ios 使用AVFoundation从视频中提取音频
热门文章
- poj3304(线段相交问题)
- GCD or LCM ---- 处理gcd和lcm同时出现的情况 1499D - The Number of Pairs
- 0x17.基础数据结构 - 二叉堆
- python生成一个窗口_PyQt5创建一个新窗口的实例
- c语言俄罗斯方块注释,C语言学习1年-俄罗斯方块(无注释)
- json数组 js html标签,js定义json对象数组 json 数组也是数组 //
- JavaScript函数式编程学习
- Linux 普通用户之间免密登陆
- A-Frame不如x3dom
- Owncloud-X安装配置