【Mysql】InnoDB 中的 B+ 树索引
接上一篇内容,InnoDB 的作者想到一种更灵活的方式来管理所有目录项,是什么?
一、目录项记录页
其实这些用户目录项与用户记录很像,只是目录项中的两个列记录的是主键和页号而已,那么就可以复用之前存储用户记录的数据页来存储目录项。
为了区分用户记录和目录项,仍然使用 record_type 这个属性,当值为 1 时,表示目录项记录,再来复习一遍:
- 0:普通用户记录
- 1:目录项记录
- 2:Infimum 记录
- 3:Supremum 记录
现在把目录项放到一个新页中,就变成了这样:

- 目录项记录 record_type 值为 1,普通用户记录的 record_type 值是 0
- 目录项记录只有主键值和页的编号,两个列
如此一来,目录页跟数据页一样,都可以为主键值生成 Page Directory(页目录),从而在根据主键值查找记录时,使用二分法来加快查询速度。
还是以查找主键值为 20 的记录为例,大致就可以分为 2 步走:
- 先目录项页(页30)通过二分法苦熬苏找到对应的目录项记录。因为 12<20<209,所以目标记录在页 9。
- 到页 9中继续根据二分法快速找到主键为 20 的用户记录。
二、当目录项记录页也变多后
一个页大小是16KB,当数据多的时候,一个页用来存放页目录记录一定不够用。解决办法也很简单,就是整更多的页。
基于上图,假设一个目录项记录页最多只能存放 4 条目录项记录(实际可以存很多),现在继续插入一条主键值为 320 的普通用户记录,这时候就需要多分配一个新页。

现在因为存储目录项记录的页是多个,此时再根据主键值查找一条用户记录,大致需要 3 个步骤(继续查找主键值为 20 的记录):
- 确定存储目录项记录的页。上图中有2个,分别是页 30 和页 32。因为页 30 表示的目录项主键值在 [1, 320),页 32 的主键值则不小于 320,所以主键 20的记录应该在 页30。
- 通过存储目录项记录的页确定用户记录真正所在的页(见上文第一部分)
- 在真正存储用户记录的页找到主键 20 的记录(见上文第一部分)
ok,解决了问题,又来了新的问题。当数据非常多,上面的2个目录项记录页也不够,又会有很多,那如何根据主键值快速定位一个存储目录项记录的页?
解决办法:目录项记录页不是多么?我再给这些页建个更高级的目录不就行了?可以想象一个多级目录,大目录里嵌套小目录,小目录里才是实际的数据。
基于上图,又会演变成这样:

- 生成了一个更高级的目录项记录的页 33
- 页中分别 2 条记录,代表页 30 和 页 32
- 如果用户记录的主键值在 [1, 320) 之间,则到页 30中继续查找
- 如果用户记录的主键值不小于 320,则到页 32 中继续查找
看出套路来了吧?随着表中记录的增加,这个目录的层级就会继续增加。
三、B+ 树
按照上面的套路,其实可以简化这个目录结构图:

其实这就是 B+ 树。
现在无论是存放用户记录的数据页,还是存放目录项记录的数据页,都存放到 B+ 树这种数据结构中。
- 所有的数据页都成为 B+ 树的节点。
- 真正存用户记录的数据页都在 B+树最底层的节点上,称为叶子节点或者叶节点。
- 而存放目录项记录的节点称为非叶子节点或者内节点。
- B+ 树最上面的节点称为根节点。
那如果说树的层级深了,找起来不也没那么快吗?
在之前的假设中规定了存放用户记录的页最多3条,存放目录项记录的最多4条,而实际上一个页存放的记录数量是非常大的。
现在继续假设,所有存放用户记录 的叶子节点的数据页可以存放 100 条用户记录,所有存放目录项记录的非叶子节点的数据页可以存放 1000 条目录项记录,那么:
- 如果 B+树只有 1 层,也就是说只有 1 个用于存放用户记录的节点,那么只能存 100 条用户记录。
- 如果 B+树有 2 层,则最多存放
1000*100= 100000条用户记录。 - 如果 B+树有 3 层,则最多存放
1000*1000*100= 100000000条用户记录。 - 如果 B+树有 4 层,则最多存放
1000*1000*1000*100= 100000000000条用户记录。
也就是说,如果有 4 层的话最多存 1000亿 条记录,很显然表里不会有这么多数据。所以在一般情况下,我们用到的 B+树不超过 4 层。
基于此,通过主键值去查询某条记录,最多只需要进行 4 个页面内的查找(3个存储目录项的页,1个存储用户记录的页)。而在每个页面内有存在页目录 Page Directory,所以在页面内也可以通过二分法快速定位记录。
本文参考书籍:
小孩子4919 《mysql是怎样运行的》
【Mysql】InnoDB 中的 B+ 树索引的更多相关文章
- 谈谈InnoDB中的B+树索引
索引类似于书的目录,他是帮助我们从大量数据中快速定位某一条或者某个范围数据的一种数据结构.有序数组,搜索树都可以被用作索引.MySQL中有三大索引,分别是B+树索引.Hash索引.全文索引.B+树索引 ...
- MySql InnoDB中的锁研究
# MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...
- mysql innodb存储引擎的聚集索引
InnoDB聚集索引 MySQL有没有支持聚集索引,取决于采用哪种存储引擎. MySQL InnoDB一定会建立聚集索引,所谓聚集,指实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚集索 ...
- [MySQL] 索引中的b树索引
1.索引如果没有特别指明类型,一般是说b树索引,b树索引使用b树数据结构存储数据,实际上很多存储引擎使用的是b+树,每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历 2.底层的 ...
- MySQL InnoDB中的事务隔离级别和锁的关系
前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...
- MySQL InnoDB存储引擎体系架构 —— 索引高级
转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...
- MySQL/InnoDB中,对于锁的认识
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解
文章出处:https://www.souyunku.com/2018/07/30/mysql/?utm_source=tuicool&utm_medium=referral MySQL/Inn ...
- 彻底搞懂MySQL为什么要使用B+树索引
目录 MySQL的存储结构 表存储结构 B+树索引结构 B+树页节点结构 为什么要用B+树索引 二叉树 多叉树 B树 B+树 搞懂这个问题之前,我们首先来看一下,MySQL表的存储结构 MySQL的存 ...
随机推荐
- Json文件解析(上)
Json文件解析(上) 代码地址:https://github.com/nlohmann/json 自述文件 alt=GitHub赞助商 data-canonical-src="https: ...
- 软件工具将GPU代码迁移到fpga以用于AI应用
软件工具将GPU代码迁移到fpga以用于AI应用 Software tools migrate GPU code to FPGAs for AI applications 人工智能软件初创公司Mips ...
- swagger 注解使用
@Api() 用于类:表示标识这个类是swagger的资源 tags–表示说明 value–也是说明,可以使用tags替代 但是tags如果有多个值,会生成多个list @ApiOperation() ...
- 面试一次问一次,HashMap是该拿下了(一)
文章目录 前言 一.HashMap类图 二.源码剖析 1. HashMap(jdk1.7版本) - 此篇详解 2. HashMap(jdk1.8版本) 3. ConcurrentHashMap ~~ ...
- MySQL笔记02(黑马)
DDL操作数据库.表 操作数据库:CRUD C(Create):创建 创建数据库: create database 数据库名称; 创建数据库,判断不存在,再创建: create database if ...
- Rethinking Training from Scratch for Object Detection
Rethinking Training from Scratch for Object Detection 一. 概述 正常训练目标检测的流程分为以下几种: 在imagenet上进行预训练,然后在特定 ...
- WordPress安全篇(1):WordPress网站启用HTTPS详细教程
以前我们浏览网页使用的都是HTTP协议,HTTP使用明文传输,所以传输过程中很容易遭受黑客窃取.篡改数据,很不安全.在WordPress网站上启用HTTPS协议访问后,能大大提升站点的安全性,启用HT ...
- 【图论】用线段树写Dijikstra!!
速度是没有极限的. 众说周知,Dijikstra是一种最短路算法,复杂度为O(V^2+E) 朴素Dijikstra void Dijikstra(int s){ memset(dis,inf,size ...
- VisualCom软件仿真平台V1.0发布(附安装包下载链接)
自我们借助VisualCom(暂定名称,后续可能会变更)软件平台撰写技术文章以来,有不少粉丝发私信询问该软件哪里来的,以及哪里有安装包,这里回复一下:VisualCom软件平台是由本微信公众号组织开发 ...
- 安卓控件RecycleView的简单使用
RecycleView的使用 目录 RecycleView的使用 技术概述 技术详述 遇到问题和解决 总结 参考文献 技术概述 RecycleView是谷歌官方对ListView的改进(并不是替代), ...