九道门|详解MySQL索引:B+树

我们在查询大批量数据的时候会发现SQL执行得很慢,这时候就会想到要去添加索引。而索引的底层结构就是B+树。

1、树是什么?

树在自然界中是一种草本植物,在这里是跟数组、链表、堆栈一样的数据结构。它的结点是有限的,并且按照层次排序成集合。结构上看起来就像一棵树,从根结点衍生向下。

既然是树,就是顶端小,越往下枝干越多。包含n(n为整数,大于0)个结点,n-1条边的有限集,具有这样几个特点:

每个结点的子结点都是从0到有限的;

最开始最顶端的结点被称为根结点,没有父结点;

除了根结点以外的结点有且只有一个父结点;

树不存在环路的概念。

树的一些概念:

结点的度:一个结点含有的子结点的个数称为该结点的度;

树的度:一棵树中,最大结点的度被称为树的度;

父结点:如果一个结点含有子结点,那么这个结点就是这些子结点的父结点;

深度:对于任意结点n,n的深度为从根结点到这一结点的唯一路径长,其中根结点的深度为0;

高度:对于任意结点n,n的高度为从n到一片树叶也就是不是父结点的子结点的最长路径,所有树叶的高度为0;

2、树的分类。

首先按照有序性可以将树分为有序树和无序树:

有序树:树中的任意子结点之间有顺序关系;

无序树:树中的任意子结点之间没有顺序关系。

按照结点包含子树的个数来分,可以分为B树和二叉树,二叉树又可以分为以下几种:

二叉树:每个结点最多含有两个子树的树称为二叉树;

二叉查找树:对于二叉树来说,如果左子树不为空,那么左子树上的所有结点的值均是小于根结点的值;如果右结点不为空的话,右子树上所有结点的值均是大于根结点的值;左右子树也分别被称为二叉排序树;

满二叉树:除叶子结点以外的所有结点均含有两个子树;

完全二叉树:如果一棵二叉树最后一层结点依次从左往右分布,同时除去最后一层结点是满二叉树;

霍夫曼树:带权路径最短的二叉树;

红黑树:每个结点都是黑色或红色,根结点和叶子结点是黑色,比如一个结点是红色的话,那么子结点一定是黑色。

平衡二叉树:一棵空树或者左右子树的高度差绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

3、B-树、B+树

B-树也被称为B树,是一种平衡的多叉树,是用于对外查找。

阶数:一个结点拥有的最多的叶子结点个数;

关键字:结点上的数字;

度:一个结点拥有叶子结点的数量。

B+树是B-树的变体,也是一棵多路搜索树。

每个结点最多只有阶数m个叶子结点;

非根结点关键值个数范围:[m/2]-1

相邻的叶子结点按照关键字排序通过指针连接。

那么B+树和B-树的主要区别在于:

B+树内部不保存数据,是作为索引来用,叶子结点才可以保存数据;

B+树相邻的叶子结点是通过链表指针连接起来的;

B+树多了一个步骤通过索引去查找叶子结点中的数据

B-树中的关键字只会出现一次,而B+树会出现多次。

大家需要掌握的索引知识当然不止这些,还有B+树的插入和删除等,这些相对比较复杂,在这里不过多赘述,有兴趣可以自己深入研究,刚入门只需要知道索引的底层逻辑是B+树即可。

相关文章