图灵学院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树:

图灵学院JAVA架构师-VIP-MySQL底层实现之B+树_第1张图片

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

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

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

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

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

B+树

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

图灵学院JAVA架构师-VIP-MySQL底层实现之B+树_第2张图片

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

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

MySQL的B+树实现

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

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

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

图灵学院JAVA架构师-VIP-MySQL底层实现之B+树_第3张图片

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

你可能感兴趣的:(mysql优化)