1、AVL 平衡二叉搜索树
AVL树本质还是一棵二叉查找树,只是在其基础上增加了“平衡”的要求。所谓平衡是指,对AVL树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过,并且左右子树都是一颗二叉平衡树。
如下所示,就是一棵由{1,2,3,4,5,7,8}构建的AVL树:
如果我们采用二叉树的形式,即使通过平衡二叉搜索树进行了改进,树的深度也是O(log2n),当n比较大时,深度也是比较大的。
每访问一次节点就需要进行一次磁盘I/O操作,对于上面的树来说,我们需要进行4次I/O操作。虽然平衡二叉树的效率高,但是树的深度也同样高,这就意味着磁盘I/O操作次数多,会影响整体数据查询的效率。
2、B-Tree
B-tree(多路平衡搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快数据存取速度。
m阶B-Tree满足以下条件:
1、每个节点最多拥有m个子树
2、根节点至少有2个子树
3、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
4、所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列
B-Tree 的结构如下图:
1、B树在插入和删除节点的时候如果导致树不平衡,就通过自动调整节点的位置来保持树的自平衡。
2、关键字集合分布在整棵树中,即叶子节点和非叶子节点都存放数据。搜索有可能在非叶子节点结束
3、其搜索性能等价于在关键字全集内做一次二分查找。
3、B+Tree
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,主流的 DBMS 都支持 B+树的索引方式。
InnoDB存储引擎就是用B+Tree实现其索引结构。
相比 B-Tree,B+Tree 适合文件索引系统。
在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
B+Tree相对于B-Tree有几点不同:
- 非叶子节点只存储键值信息,用于索引。
- 非叶子节点的关键字也会同时存在子节点中,并且是子节点中所有关键字最大或最小的。
- 所有叶子节点之间都有一个链指针。
- 数据记录都存放在叶子节点中,叶子结点构成一个有序链表。
- B+Tree查询效率更高更稳定,查询范围上,B+Tree也比B-Tree大。