索引的功能即提高查找速度,从能够提高查找速度的数据结构说起。
目录
①二叉排序树
二叉排序树,若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左、右子树也分别为二叉排序树。
如果二叉树的结构良好,其高度与树中结点个数n成对数关系,检索的时间开销为O(logn),但是如果树结构为畸形,检索的最坏时间可能达到O(n)
②平衡二叉树(AVL树)
是一种特殊的二叉排序树,要求平衡因子(左子树高度减去右子树高度绝对值不超过1),AVL的通过四种旋转维护其性质。
使用AVL树做索引也有弊端:
(1)维护平衡过程的成本代价很高,因为每次删除一个节点或者增加一个节点的话,需要一次或者多次的左旋,右旋等去维护“平衡”状态。
(2)然后是查询的效率不稳定,叶子结点不在同一平面,有可能第一次就查到。
(3)然后是如果节点很多,那么这个AVL树会很高降低查询效率。
(4)AVL树结点储存内容较少,因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。
③B-树
B树特点:
1)B树每个结点多个分支,m阶B-树规定非叶子结点中的分支(子树)数量(关键字数量在此基础-1)范围是 [m/2向下取整,m](有n个分支结点有n-1个关键字,有一个分支是储存关键字数量的)。则相同数量关键字B-树高度更低,检索更快。
2)结点储存关键字更多,能更好地利用磁盘局部预读的特性。
3)所有的叶子节点的高度都是一样,这个保证了每次查询数据时比较稳定的查询效率。但仍有可能第一个就查到了数据,查询的效率不够稳定。
④B+树
B+树特性
①:B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有,B树在内部节点出现的索引项不会再出现在叶子节点中。中间节点全是索引节点,一个是可以降低树的高度,另一个是一个中间节点可以索引到更多的记录,因为B+ Tree中节点的内节点无 data 域,但是操作西荣每次IO的页的大小是固定的,那么每次IO读取若干个块块中包含的Key域的值更多,B+树单次磁盘 IO 的信息量大于B树,从这点来看B+树相对B树磁盘 IO 次数少。
②:叶节点两两相连可以直接在叶子节点层横向遍历,可使用在范围查询等,而B-树b树想要遍历则需要叶子节点和上层节点不停往返(先序中序后序)。
③:叶子结点在同一高度,且指向记录的指针都在叶子结点,所以查找效率稳定在O(logn)
参考:https://blog.csdn.net/qq_36520235/article/details/94317993