我们在查询大批量数据的时候会发现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+树即可。