0
点赞
收藏
分享

微信扫一扫

MySQL中的索引结构B-Tree和B+Tree

云竹文斋 2022-02-21 阅读 198


前言

今天重点说一下B-Tree索引。文中的大部分图都是盗取来的。

正文

首先简单的介绍一下什么是​B-Tree:

一种适用于外查找的树,一种平衡的多叉树并且具有以下的特点:

(一颗根节点最大为m个关键字的树)

1、树中每个节点最多有m个孩子;

2、除去根节点和叶子节点外,其他每个节点最少有m/2个孩子;

3、如果根节点不是叶子节点,则至少有2个孩子;

4、所有叶子节点都出现在同一层,叶子节点不包含任何关键字信息;

5、所有非终端节点中包含有信息(P0,K0,P1,K1,P3,…,Ki,P(i+1)),其中:Ki(i=0,1,2,…,m)为关键字,且Ki<K(i+1),Pi(i=0,1,2,…m+1)为指向根节点的指针,m为关键字的个数。

6、非叶子节点的指针:P0,P1,P2,…,Pm;其中P0指向关键字小于K0的子树,P(m+1)指向大于Km的子树,其他Pi指向关键字属于(Ki,K(i+1))的子树。

如图所示:

MySQL中的索引结构B-Tree和B+Tree_子节点

B-Tree的特性:

1、关键字集合分布在整棵树中;

2、任何一个关键字出现且只出现在一个节点中;

3、搜索有可能在非叶子节点结束;

4、其搜索性能等价与在关键字全集内做一次二分查找;

5、自动层次控制;

大家可以参考这个动图,图中说的是B-Tree的插入过程:

B+Tree​是在B-Tree的基础上发展来的。

差异:

1、有m个子节点必然有m个关键码;

2、非叶子节点仅具有索引作用,跟记录有关的信息均存放在叶子节点中;

3、树的所有叶节点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

如图所示:

MySQL中的索引结构B-Tree和B+Tree_B+Tree_03

下边的图是B+Tree的插入动图:

通过上边的简单介绍应该对两种类型的树有了认识。Mysql中使用的是哪种结构呢?通过查询各种资料然后汇总如下:

比B树更适合作为索引的结构是B+树。MySQL中也是使用B+树作为索引。

B树:有序数组+平衡多叉树;

B+树:有序数组链表+平衡多叉树;

B+树的关键字全部存放在叶子节点中,非叶子节点用来做索引,而叶子节点中有一个指针指向一下个叶子节点。​做这个优化的目的是为了提高区间访问的性能。而正是这个特性决定了B+树更适合用来存储外部数据。

数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。

正如上面所说, ​在数据库中基于范围的查询是非常频繁的,因此MySQL最终选择的索引结构是B+树而不是B树(这句话可能不是很严谨)​。

结束

其实在MySQL中不同存储引擎对索引的实现方式是不同的,MyISAM和InnoDB两个存储引擎的索引实现方式。

1、MyISAM引擎使用B+Tree作为索引结构

2、虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。(详细的内容可以搜索:MySQL索引背后的数据结构及算法原理)

动图引用的博客:浅谈算法和数据结构: 十 平衡查找树之B树

还有一篇写的比较详细的博客:BTree和B+Tree详解



举报

相关推荐

0 条评论