Mysql索引数据结构

数据库索引为什么用B+树而不用B-树?

数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。

B+树和B-树的区别

B+树中间节点没有存储数据,只有叶节点存放数据,其余节点用来索引,所以同样大小的磁盘页可以容纳更多的节点元素,而B-树是每个索引节点都会有Data域。这就意味着,数据量相同的情况下,B+树的结构比B-树更加“矮胖”,因此查询是IO次数也更少。这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据。

其次,B+树的查询必须最终查询到叶子节点,而B-树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点。

因此,B-树的查询性能并不稳定(最好情况是只查根节点,最坏情况是查到叶子节点)。而B+树每一次查找都是稳定的。

综合起来,B+树相比B-树的优势有三个:

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询。

为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?

hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树:树的高度随着数据量增加而增加,IO代价高。

总结一点就是:使用B+树而不是用其他结构的原因就是为了减少磁盘IO的次数,减少数的高度,而B+树就很好的做到了这一点

那么什么情况下使用红黑树?红黑树和B树使用场合有什么不同?

两者都是有序的数据结构,可用作数据容器。

红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。
B树多用在内存里放不下,大部分数据存储在外存上时。因为B树层数少,因此可以确保每次操作,读取磁盘的次数尽可能的少。

在数据较小,可以完全放到内存中时,红黑树的时间复杂度比B树低。
反之,数据量较大,外存中占主要部分时,B树因其读磁盘次数少,而具有更快的速度。
————————————————
版权声明:本文为CSDN博主「kongmin_123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kongmin_123/article/details/82055901

你可能感兴趣的:(mysql)