二叉树、红黑树、B树、B+树、哈希索引、为什么Mysql选择B+树?

二叉树、红黑树、B树、B+树、哈希索引、为什么Mysql选择B+树?

😂

哈希索引:

哈希索引的查询速度是非常快的

在这里插入图片描述
缺点
但为什么没有用它呢,因为哈希索引的哈希值是无序的,是无法进行排序操作的,也不能做范围查询等。所以Mysql放弃这个哈希索引

二叉树:

在这里插入图片描述

二叉树,全名叫二叉搜索树。存入的数据以第一条数据为基准,小于放左,大于放右

那么他存在一个什么问题呢?
在这里插入图片描述
缺点:
因为他是以第一条数据为基准的,如果第一条数据过小或过大,他后面数据会全部放在左边或右边,导致树的深度过高,树的深度越高每一次查询的次数就会越多,效率越慢,
而且如果存放数据是有序的:
在这里插入图片描述
如图所示,在有序的情况下很变态,直接成为一个链表,存放10 条数据,深度就为10和没有索引没什么区别。

红黑树:

红黑树,他是二叉树的变体,可以通过左右旋转保证树的深度

同样存储10条数据
在这里插入图片描述

可以看到,他比二叉树的深度低的多,他是怎么做到的呢?

他底层在二叉树的基础上,对进行插入和删除操作时通过特定操作(如左旋转,右旋转等)保持二叉查找树的平衡,从而获得较高的查找性能。

什么是左旋转,右旋转呢?
左旋转:被旋转的节点从左侧上升到父节点
右旋转:被旋转的节点从右侧上升到父节点 

缺点:
虽然红黑树的深度已经较二叉树有所提升,但是当数据量过大时,如上万或者上百万条数据时他是深度会随之变高。效率较慢,而且红黑树和二叉树都有一个问题,就是回旋查找。

什么是回旋查找?
就是红黑树和二叉树在做范围查找时候如小于5的数据的时候,如上图,他需要先找到5的位置,然后回旋回去去找父节点6,然后6还要去找4,然后一级一级拿出所有小于5的数据,这样是十分缓慢的。

B树:

B树又叫B-树,他在树的基础上对节点进行横向的拉伸

在这里插入图片描述
如上图所示,B树在一个节点上可以存放多个索引,在同样在数据量下 它的深度低很多,他解决了红黑树深度过高的问题,但是他和红黑树一样存在回旋查找的问题。

如上图所示:
和红黑树二叉一样,如果B树做范围查找小于5的树 他还是需要回旋到父节点6,然后6去找4…

B+树:

和B树而言,B+树的深度更低,而且解决了回旋查找问题,对范围查询支持很友好

首先谈谈为什么B+树的深度更低,

那就要谈谈他和B树的区别,B+的和B树的区别是,B树会在所有节点存放数据 如 非叶子节点(索引节点) 和叶子节点,而B+的非叶子节点只存在索引,并不会存数据,就导致在同样固定的索引存储大小的情况 因为B+树不会将数据存在非叶节点 那么他的非叶节节点就可以存放更多的索引。

在百万级别的数据下,他的深度比B树更低,深度更低就代表查找速度越快。

为什么B+树能解决回旋查找?
在这里插入图片描述

如图所示,可以看到因为他非叶子节点不存储数据,所有非叶子的上的数也出现在了叶子节点,叶子节点之间是通过指针相连接的。

因为叶子节点通过指针连接所以在做范围查找时,如小于5的数据,可以之间定位到5然后取5左边的数据 即可 解决的其他索引出现的回旋查找问题。

缺点:

	B+树虽然已经很好了,但是也有缺点。

和B树对比,想象一下假如查找的数据正好是非叶子节的数据,那么B树就可以直接在非叶子节点拿到数据,而B+树的数据全部存在叶子节点,非叶节点只存放索引,那么他在非叶子节点找到数后还需要去下层叶子节点去拿值。性能肯定是没B树快的

总结:

B+树虽然查找速度不是最优的,但是依靠着他对范围查询的完美支持,所以Mysql才会选择B+树

新手程序员第一次写文章,全是自己的理解,如果有什么错误希望前辈能指出!
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值