b+树和b树的区别_B+树和B/B树的区别?Mysql为啥用B+树来做索引?

本文探讨了数据库中为何需要索引,以及索引存储在硬盘的原因。文章深入浅出地介绍了提高表查询速度的方法,包括从二分查找到多叉树的演变,进而引出B树和B+树的概念。B+树因其更矮更胖的特性,存储更多数据,查询效率更稳定,读写磁盘次数少,被MySQL选作索引实现方式。
摘要由CSDN通过智能技术生成

一、为什么需要索引?

大家都知道,我们读取数据时要避免全表扫描,那如何避免全表扫描呢?目前科学家给出的目标就是索引。索引就好比一本字典的目录一样,有了目录读者就不需要翻找全书来找内容。同样有了索引,数据库就不用全表扫描了。

在一张数据表中不管你建不建索引都会有一个默认索引。如果有主键,则mysql会自动按照主键建索引。如果没有主键,mysql也会创建一个默认索引。所以:

在创建表的时候,一定要创建主键。

二、为什么索引存储在硬盘之中呢?

索引是存储在硬盘之中的,这是为什么呢,大家想一下,如果出现意外情况(如:断电),那索引就全没了。所以索引是一定要存储在硬盘上的。但是存在硬盘上有一定的缺陷:性能的降低。

大家知道硬盘的读写速度是远不如内存的,如果频繁的读写硬盘索引,那性能将会非常的低。

三、探索如何提高表的读取速度?

如何提高表的查询速度呢?折半查找是一个好办法,它的时间复杂度是O(log2n),这里我举个例子,我们对数列(5,12,15,27,34,77,89)创造出来的二分查找树如下图所示:

cd3039d3dc6ee5157102554d34f17714.png

这是我组建的一棵平衡二叉树,查找效果比较理想,但是也有不理想的情况,比如下面二种情况:

3b8669c97e848b9b01b0388b6bf278b9.png

像这样二种情况,查找效率就低非常多了,时间复杂度是O(n)。

像第一种平衡二叉树在mysql中也有很大的不足之处:随着表中数据的增加,二叉树的深度将会非常大,这样导致查找的次数非常多,上面我们提到索引是存储在硬盘上的,如果树的深度太大的话,性能将会非常的低下。

针对二叉树的这种缺点,科学家们引进了多叉树,如下面场景:

3d08f4d6b04e822d63061f6113e63e1a.png

多叉树的优点就是极大的减少了树的深度,我们下面要讲的B+和B树就是多叉树。

四、B/B-树介绍

B树 英文名是Balance Tree, 全名是平衡多路搜索树。B树的结构图如下:

9822b4f261b38a51a0cf863e53ded79e.png

这里的B树,我不可能画太多数据,只能给大家看看大体样子。3层深度的B树大约能存储100万的数据。深度减少能极大的减少磁盘读取次数,虽然每个节点比较次数不少,但是如果把每个节点的数据读到内存中比较,那这个比较时间就可以忽略不计了。所以用B树来存储对MySQL来说是非常合适的。

B树有以下特点:

1.所有键值分布在整颗树中(索引值和具体data都在每个节点里);
2.任何一个关键字出现且只出现在一个结点中;
3.搜索有可能在非叶子结点结束(最好情况O(1)就能找到数据);
4.在关键字全集内做一次查找,性能逼近二分查找;
5.所有叶子节点位于同一层。

五、B+树介绍

B+树是B树的升级版,结构图如下:

a88733f6331689229920a10c59c8e89a.png

B+树相对于B树有以下特点:

1.所有关键字都会在在叶子节点出现,2.内部节点(非叶子节点)不存储数据,数据只在叶子节点存储3.所有叶子结点构成了一个链指针,而且所有的叶子节点按照顺序排列。

那B+树比B树有什么优势呢?

  1. 每一层更宽,更胖,存储的数据更多。因为B+树只存储关键字,而不存储多余data.所以B+树的每一层相比B树能存储更多节点。

  2. 所有的节点都会在叶子节点上出现,查询效率更稳定。因为B+树节点上没有数据,所以要查询数据就必须到叶子节点上,所以查询效率比B树稳定。而在 B 树中,非叶子节点也会存储数据,这样就会造成查询效率不稳定的情况,有时候访问到了非叶子节点就可以找到关键字,而有时需要访问到叶子节点才能找到关键字。

  3. 查询效率比B树高。因为B+树更矮,更胖,所以和磁盘交互的次数比B树更少,而且B+树通过底部的链表也可以完成遍历,但是B树需要找到每个节点才能遍历,所以B+树效率更高。

总体来说,B+树因为更矮更胖能存储更多数据、效率稳定,读写磁盘次数少,比B-树效率更高,据统计,一棵深度为3的B+树能存储2000万以上条数据。所以最终选择了B+树。

结尾

好了,就介绍到这里吧,关注我,每天更新优质内容。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值