InnoDB存储引擎相关问题整理
文章目录
- 一、为什么MySQL要使用InnoDB做为其存储引擎
- 二、为什么InnoDB表必须要有主键,且建议使用整形的自增主键
- 三、聚簇索引和非聚簇索引
- 四、联合索引
- 五、Hash索引
- 六、MRR
一、为什么MySQL要使用InnoDB做为其存储引擎
1、解释InnoDB存储引擎的底层结构为B+树的特点
1、B+树的基本数据结构:B+树为有序数组链表+平衡多叉树(解释)
2、B+树的数据结构是怎样:
- 根节点存索引;
- 叶子节点存索引和数据;
- 所有的数据都存放在叶子节点上;
- 子节点一定包含其对应父节点的所有信息;
- 叶子节点之间有一个单向链表进行连接(但是InnoDB底层对B+树进行了改进,使用双向链表进行连接)
- …
2、引出B树,并且分别解释两种数据结构的差异及优缺点
1、B树的基本数据结构:B树为有序数组+平衡多叉树(解释)
2、B树的数据结构:
- 每一层级的节点都分别包含了索引和数据
3、差异:
- B树的叶子节点没有链表
- B树的子节点不含有父节点的所有数据
- B树的父节点含有data数据
- …
4、优缺点
- B+树有链表方便排序,范围查找可以不用进行磁盘IO
- B树父节点同时含有索引和数据,会影响树的高度:磁盘加载是以块为单位进行,每一个节点变大了,那么一块里面的节点就会变少,同样的数据,树的高度就会更高
- B树是可以出现只进行一次磁盘IO就定位到数据的情况,但是B+树一定会进行多次磁盘IO,直至遍历到叶子节点
- …
二、为什么InnoDB表必须要有主键,且建议使用整形的自增主键
1、如果InnoDB表没有主键,但由于其需要通过B+树构建对应的数据结构,所以InnoDB存储引擎会看表是否有主键,如果有就用用户自己定义的主键索引来构建索引树,如果没有那么就会去看数据库表中是否存在记录唯一的列,如果存在就用这个唯一的列区构建索引树。如果主键也没有,唯一列也没有,那么存储引擎就会去创建一个隐藏列,用来构建对应的B+树索引结构
2、如果主键不自增(hash、uuid),构建的B+树索引结构会随时进行大的变动。因为B+树本质是有序树,无序的id会让树的索引结构发生数据节点转移
三、聚簇索引和非聚簇索引
1、聚簇索引可以理解为主键索引(Primary Key),即唯一标识一条数据的索引。如果表记录中没有主键,那么会选择表中字段唯一的数据当作其聚簇索引,用来维护B+树。如果既没有主键又没有唯一数据列,那么数据库会给表的每一行记录添加一个默认的隐藏id,用于构建对应的聚簇索引,依次来维护对应的索引B+树
2、非聚簇索引可以理解非主键索引。对于非聚簇索引,InnoDB底层也会维护一棵B+树的索引结构。当我们使用非聚簇索引(Secondary Key)列进行数据查找时,它首先会先去非聚簇索引的索引树上查找,最终会定位到非聚簇索引上的叶子节点。非聚簇索引对应的叶子节点存储的数据为对应数据库表维护的聚簇索引(主键id)。然后根据聚簇索引的值在聚簇索引维护的索引树上进行data数据的定位,即回表查。最终得到我们想要的数据。
四、联合索引
1、如果联合索引是聚簇索引(主键索引),那么对应的叶子节点就是完整的data数据
2、如果联合索引是非聚簇索引(非主键索引),那么对应的叶子节点就是主键索引值,想要定位到完成的data数据,还需要去聚簇索引维护的索引树上查询数据
五、Hash索引
构建的索引树类比HashMap的结构进行理解,查询的效率极高,但是无法进行范围比较。不适合做主键索引,适合用作没有范围查找的数据列,即适用于IN、=,不适用于<、>
六、MRR
该概念是MySQL中的Disk-Sweep Multi-Range Read(与标题不是十分符合)
当我们使用非聚簇索引查找数据时,首先会根据非聚簇索引查询到对应的结果(在非聚簇索引构建的B+树上),然后根据非聚簇索引的叶子节点的数据(构建聚簇索引的主键)进行回表操作,此时对需要进行回表扫描的数据进行一个优化排序,这样就会使得存放于同一个物理磁盘块的数据能够在一次查询的时候将数据直接查询出来。这个对非聚簇索引的叶子节点进行排序的优化的操作,叫做MRR
InnoDB存储引擎相关问题整理相关推荐
- Mysql技术内幕InnoDB存储引擎——InnoDB存储引擎
特此申明: 前段时间找工作所以看了<Mysql技术内幕InnoDB存储引擎>,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处.不过无所谓啦,写出来自己看看,需要的 ...
- MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02
MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...
- java innodb存储引擎_InnoDB存储引擎简介
前言: 存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的.虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储 ...
- MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01
MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...
- MySQL内核:InnoDB存储引擎 卷1
MySQL内核:InnoDB存储引擎卷1(MySQL领域Oracle ACE专家力作,众多MySQL Oracle ACE力捧,深入MySQL数据库内核源码分析,InnoDB内核开发与优化必备宝典) ...
- 宋利兵 mysql_MySQL数据库InnoDB存储引擎Log漫游(3)
做者:宋利兵html 来源:MySQL代码研究(mysqlcode)mysql 0.导读 本文重点介绍了InnoDB的checkpoint和Buffer Pool管理算法 04 – Checkpoin ...
- Innodb存储引擎-idb文件格式解析
文章目录 ibd 文件格式解析 idb文件 page类型和格式(File Header & Trailer) FIL_PAGE_TYPE_FSP_HDR 格式 Extent Descripto ...
- 1009MySQL数据库InnoDB存储引擎Log漫游
00 – Undo Log Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atom ...
- 15.2. InnoDB存储引擎
原贴:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/storage-engines.html#innodb-overview 15.2. ...
- Mysql技术内幕——InnoDB存储引擎
一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据 ...
最新文章
- python中open函数的使用
- 如何干掉恶心的 SQL 注入?
- C++ 区分中文,非中文,截取含有中文的string字符串的两种方法
- 《Java开发手册》解读:大整数传输为何禁用Long类型?
- 开发服务器 VSS开发库 自动备份方案
- 数据库高级知识——索引优化分析(二)
- mysql集群fuzhi_MySQL集群 和MySQL主从复制的不同
- linux中proc文件系统 -- ldd3读书笔记
- 面试:输出循环小数的循环节
- WordPress如何开启用户注册功能
- HTML5 — 知识总结篇《IV》【实体字符】
- JS易混淆的方法整理
- 华为p10点击六下android,要被口水喷到死机的华为P10 你用的怎么样
- HTTP的概念以及请求消息的数据格式
- vue打印指定的html,使用window.print()打印指定的一个vue 组件
- “我们”是量子计算业内人士,“我们”在炒作
- 如何干净的卸载Mac版VMware Fusion
- 两个龙的linux,Linux办公一条龙之组件间的调用
- 前后端分离和不分离到底有什么区别
- 学习OpenCV3 面阵相机标定方法
热门文章
- element-ui的密码验证
- php urlencode 大写,HttpUtility.UrlEncode 编码输出的字母替小写,怎样改成大写呢
- 解决mysql编码问题_解决mysql乱码问题
- 管理c语言源代码,c语言源代码---------------个人图书管理系统
- springboot mongo查询固定字段_SpringBoot中文参考指南(2.1.6)32、使用 NoSQL 技术
- 超能搜索系统输入关键字_电商后台设计——搜索
- 明基5560 win7 64驱动_这个Win7系统,稳定又纯净!
- 随机函数_巧用随机函数,生成各种姓名组合。
- go mysql driver事务,Go 数据库事务的源码分析
- yii 获取当前域名_yii2 在域名后面加一个路径作为首页