一、什么是索引?
索引(index)是数据库高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式指向真在的数据,这种数据结构就是索引。
二、为什么选择B+树
为什么不使用二叉树、B树,要使用B+树呢?
1、二叉树
在看B+ 树之前,我们先看一下二叉树
左边这个二叉树的时间复杂度是O(log n),而右边这个二叉树查询的时间复杂度是O(n),就已经退化成一个链表了,二叉树的时间复杂度不稳定;
2、红黑树
那么为什么不实用红黑树呢?
优点:红黑树的时间复杂度很稳定,它的时间复杂度是O(log n)
缺点:红黑树也是一个二叉树,每个节点只有两个分叉(只有两个字节点),如果要存储1000万的数据,那么它的层级就会很高(很多层),如果要查数据的话,还是不够高
3、B-树
B-Tree,B树是一种多叉路平衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。
以一棵最大度数为5(5阶)的B-Tree举例,那这个B树的每个节点最多存储4个key。
灰色部分是指针,指向子节点的数据,子节点的数据大小都在两个蓝色数据之间
蓝色部分表示数据(key,键值)
绿色部分表示真正的数据(索引指向的数据)
跟二叉树一样,里面的数据都是左边小右边大,但是相比二叉树来说,由于最多有4个key和多个分支,B树的层级就比较短,可以称为矮胖树。层级短,查询的效率就高
4、B+树
B+树是在B树的基础上进行的一种优化,使其更适合实现外存储索引结构,InnerDB存储引擎就是使用的B+树实现其索引结构
首先,B+树也是多阶的,不同的点在于,
1、B+树的非叶子节点,只存储指针和key,不存储数据
2、上面的非叶子节点,只用来找到叶子节点的数据,而且非叶子节点上的数据也能在叶子节点上找到,比如图中的38、58等
3、叶子节点之间使用双向指针进行互相连接,如图中的6,12和16,18相连
相比于B树,B树有以下几个优势:
1、磁盘读写代价相比B+树更低;
如图中所示,如果要查询12 这个数据,由于B树的非叶子节点也是包含数据的,所以B树会加载出38中的(指针、key、数据),再加载出16和29中的(指针、key、数据),最后查询到12中的(指针、key、数据);
而B+树只有在叶子节点存储数据,非叶子节点只保存 指针和key值,只会查询12中的数据,前面的38和16则只和他们对比了key值,还有就是使用了38和16中的指针
2、查询效率B+树更加稳定
由于B+树的数据都保存在叶子节点,所以要查询什么数据,所要查询的层级(高度)是差不多的,查询效率更稳定
3、B+树便于扫库和区间查询
比如我们要查询6-34之间的数据,B+树,只要查询到6,再往右,使用双向指针进行查询到34为止即可,区间查询很快
综上所述优点,MySQL使用了B+树的索引结构