1.首先从hash表开始
hash表检索速度很快,时间复杂度为O(1),但是不能进行范围查询,而数据库的调用往往需要用到范围查询
2.为了解决范围查询,用到了二叉排序树
二叉排序树解决了范围查询问题,但是存在极端情况,就是二叉排序树只有左子树,而且左子树呈现链状,这种情况下,查询效率就非常低了,并且数据库中的主键例如id等大部分情况下也是呈顺序排列
3.为了解决极端情况,提出了红黑树和AVL(自平衡二叉树)
红黑树是平衡二叉树的一种,但也存在极端情况,就是也呈现链状,但是这个链状比二叉排序树要好
这个问题由AVL解决,自平衡二叉树,实现了较好的范围查询,并且不会出现极端情况,但是又有一个新的问题,就是IO次数太多,自平衡二叉树每一层的节点只存储一个数据,要查询第三层的数据就要用3次IO,经过查询可知,查询消耗的时间都集中在了磁盘IO上
4.为例解决IO读取耗时问题,提出了从B树和B+树
B树在每一个节点可以存储多个数据,2个,4个,8个。可以降低磁盘IO,并且B树的查询性能为O(h*logn),其中h为树高,n为每个节点的数据个数,可以进行范围查找等,看起来相当不错
5.而B+树是在B树的基础上进行了优化
第一,B 树一个节点里存的是数据,而 B+树存储的是索引(地址),所以 B 树里一个节点存不了很多个数据,但是 B+树一个节点能存很多索引,B+树叶子节点存所有的数据。
第二,B+树的叶子节点是数据阶段用了一个链表串联起来,便于范围查找。
总结:通过 B 树和 B+树的对比我们看出,B+树节点存储的是索引,在单个节点存储容量有限的情况下,单节点也能存储大量索引,使得整个 B+树高度降低,减少了磁盘 IO。其次,B+树的叶子节点是真正数据存储的地方,叶子节点用了链表连接起来,这个链表本身就是有序的,在数据范围查找时,更具备效率。因此 Mysql 的索引用的就是 B+树,B+树在查找效率、范围查找中都有着非常不错的性能