B+tree和红黑树的区别?为什么MySql不使用红黑树?

B+tree

B:指的是balance(平衡)

Tree:指的是二叉查找树。

二叉查找树是一种借鉴了二分查找思想的数据结构。如图:

B+tree和红黑树的区别?为什么MySql不使用红黑树?_第1张图片

特点:左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大

但是在极端情况下会出现下图所示:

B+tree和红黑树的区别?为什么MySql不使用红黑树?_第2张图片

已经快退化成一条链表了。这时查询方式和遍历几乎没有区别。

为了防止这种情况:

出现了二叉平衡树这种结构:B+tree和红黑树的区别?为什么MySql不使用红黑树?_第3张图片

 

特点:平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1

如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡。为了恢复自己的特性,会通过旋转来使自己重新达到平衡。

B+tree和红黑树的区别?为什么MySql不使用红黑树?_第4张图片

B+tree和红黑树的区别?为什么MySql不使用红黑树?_第5张图片

显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树,红黑树具有如下特点:

1、具有二叉查找树的特点。

2、根节点是黑色的;

3、每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存数据。

4、任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的。

5、每个节点,从该节点到达其可达的叶子节点是所有路径,都包含相同数目的黑色节点。

B+tree和红黑树的区别?为什么MySql不使用红黑树?_第6张图片

红黑树,牺牲严格的平衡要求,以换取新增/删除节点时少量的旋转操作,一棵红色黑树最多需要3次旋转就使其达到平衡。

平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况。

红黑树平均的层数比AVL树稍微多一些,维护的代价稍微小一些,实际上是差不多的。

应用:

  • Java中,TreeMap、TreeSet都使用红黑树作为底层数据结构
  • JDK 1.8开始,HashMap也引入了红黑树:当冲突的链表长度超过8时,自动转为红黑树
  • Linux底层的CFS进程调度算法中,vruntime使用红黑树进行存储。

从上面来看二叉树的单论查找效率,二叉平衡树的已经是最快的了,但是我们的数据是存放在磁盘上的,所以不仅要考虑查找效率,还要考虑磁盘的寻址加载次数。

B-tree:平衡多路查找树

B+tree和红黑树的区别?为什么MySql不使用红黑树?_第7张图片

 

B+Tree:

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。B+tree和红黑树的区别?为什么MySql不使用红黑树?_第8张图片

 

和Btree的区别:

  1. 非叶子节点只存储键值信息。
  2. 所有叶子节点之间都有一个链指针。
  3. 数据记录都存放在叶子节点中。

这也意味这在扫表的时候,b+tree比B-tree性能更好。

B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

总结:由于红黑树的出度为 2,而 B+ Tree 的出度一般都非常大,所以红黑树的树高 h 很明显比 B+ Tree 大非常多,检索的次数也就更多。

你可能感兴趣的:(Mysql,mysql,b树,数据结构)