图灵mysql_图灵学院JAVA架构师-VIP-MySQL底层实现之B+树

目前,MySQL中使用最多的引擎是InnoDB和MYISAM。

这两种引擎都是采用B+树的数据结构来构建索引,B+树是B树的变种,首先我们先来了解下B树的数据结构。

B树

B树是一棵多路平衡查找树,简单来说,B树可以看做平衡二叉树的进阶版,它与平衡二叉树的不同点主要在B树的一个节点可以存放多个关键字,并且B树的每个节点可以有两个以上的子节点,而这些都取决于B树的阶数,当B树的阶数为2时,它就是一个普通的平衡二叉树。

我们描述一棵B树是需要定义它的阶数,阶数定义了它最多会有多少个子节点。一棵m阶的B树简单定义如下:

1.每个节点最多可以有m个子节点

2.每个节点最多可以存放m-1个关键字

下面是一棵3阶的B树:

db6805bf2bff0df2ce873a02a7bf1c89.png

B树与平衡二叉树查找效率比较

上面我们简单介绍了B树,通过观察发现,单纯从数据结构来讲,B树和平衡二叉树在查找的时间复杂度上并没有什么区别,但数据结构比平衡二叉树复杂一些,那么为什么要用到B树来做查询树呢?

我们都知道,计算机读取数据的操作中最耗时的是从磁盘中读取数据,在大多数linux系统中,每次磁盘io会取出4k的连续数据。

平衡二叉树因为每个关键字都存放在独立的节点,无法保证在磁盘中的物理存储地址是连续的,因此,在最坏的情况下,每个关键字的读取都需要进行一次磁盘IO。

而B树的每个节点可以存放多个关键字,每个节点的关键字在磁盘中的物理存储地址都是连续的,使得每次磁盘IO都可以读取多个关键字,大大减少了磁盘IO次数,使得查找时间更快。

B+树

B+树是B树的变种,其结构如下:

65b95b8d34294a7f26e7eb6acd7cc44e.png

在B+树中,所有的关键字都会保存在叶子节点中,叶子节点之间也会有指针进行连接,形成一个链表的形式,和B树相比,这样的结构方便范围查找。

比如要查询大于5的关键字,我们从根节点往下遍历,找到关键字为5的叶子节点之后,直接读取5之后的叶子节点就可以了,而不用一次次的从根节点去遍历大于5的关键字。

MySQL的B+树实现

上述的B+树在范围查找的时候也有缺点。

当我们进行的范围查找进行倒序操作的时候,凭借叶子节点的单向链表是无法实现的。

基于这样的情况,MySQL中的B+树结构做了一些调整,其结构如下:

c5e417ad4bccfb6c2ad07ff3b72f10a0.png

MySQL将B+树叶子节点的单向链表改为双向链表,解决了倒序范围查找的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值