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

前言

今天重点说一下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))的子树。
如图所示:
在这里插入图片描述
B-Tree的特性:
1、关键字集合分布在整棵树中;
2、任何一个关键字出现且只出现在一个节点中;
3、搜索有可能在非叶子节点结束;
4、其搜索性能等价与在关键字全集内做一次二分查找;
5、自动层次控制;

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

B+Tree是在B-Tree的基础上发展来的。
差异:
1、有m个子节点必然有m个关键码;
2、非叶子节点仅具有索引作用,跟记录有关的信息均存放在叶子节点中;
3、树的所有叶节点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。
如图所示:
在这里插入图片描述
下边的图是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索引背后的数据结构及算法原理)

动图引用的csdn博客:浅谈算法和数据结构: 十 平衡查找树之B树
还有一篇写的比较详细的博客:BTree和B+Tree详解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章