数据结构—B树、B+树


————————————————————————————————
在这里插入图片描述

B树

B树的特点

1、B树的数据存储是key-value类型

2、B树的分叉——并不确定,要看具体实现

3、M阶B树:分成n个叉就是n阶B树,每个节点上最多有n-1个值

 3.1)每个节点上最多有M-1个值,并且以升序排列(2-3-4树也可以叫4阶B树)
 
 3.2)从下向上构建

注:2-3-4树也可以叫4阶B树
例:5阶B树:
在这里插入图片描述
value可以是任意数据类型
5阶B树构建示意:
在这里插入图片描述

为什么要有B树:

红黑树和B树比较

1、从内存的角度来说,查找时红黑树和B树哪个更好?
——>内存的主要作用是向CPU供数据
理论上:红黑树和B树时间复杂度都是O(logn)
真实情况上:
根据数据对比次数来看:cpu进行数据的判断,告诉游标向左走还是向右走
因为红黑树和B树都是在内存当中,内存向CPU提供数据的时间是相等的;

  • 在B树,每一个节点都比较大,可能是十几阶,每一个节点比较的次数多;
  • 在红黑树,每次比较都能折半;

在节点对比上,B树的对比次数要多;因此红黑树对比次数相对较好,所以红黑树是内存最优二叉树
2、为什么要存在B树?
因为计算机存储还有磁盘,在磁盘中,B树更优。

原因: 在磁盘当中,数据寻址浪费时间。
(在磁盘中,数据存储在磁道当中,读取数据需要磁头;因此在磁盘中,读取数据的时间=磁头移动的物理时间+平均盘面旋转半圈;)

  • B树比较矮,数据寻址次数少,寻址时间较少,因此在磁盘中,B树比红黑树好
  • B树多用于磁盘,原因是数据如果分成多个查询,会降低树的高度,降低寻址次数和时间。

B+树

B+树是B树的一个分支,和传统的B树不太一样
B+树被拿出来进行改造,作为mysql的专用数据库,是mysql专用底层数据结构
优势在于寻址

B+树的特点

1、B+树非叶子节点仅具有索引功能,也就是说,非叶子节点只能存储key值(只能做索引),不能存储value值;

2、B+树的所有叶子节点会构成一个有序的链表,这样就可以根据key值遍历数据。

为什么要有以上两个特点??——>为数据库功能服务

B+树构建过程

以5阶B树为例:
在这里插入图片描述

查询时数据提供数据

真实的数据查询是发生在内存当中的,寻址是在磁盘当中(B+树优势在于寻址)
数据推送(提供)的顺序:磁盘——>内存——>CPU

1)没找到数据之前,选用B树查找数据(如果B树和红黑树都在磁盘中,B树找到数据的速度更快);

2)找到后,数据需要放到内存,再传输给CPU

磁盘向cpu推送数据

磁盘每次向CPU推送一页的数据(固定的大小:4KB,如果一次推送的数据不够4KB,那么剩下的空间也不能推送)
注:
1)页是数据存储的逻辑单元;

2)假如一个文件大小为2KB,一个文件大小为3KB因此磁盘推送数据要推送和两次,一次2KB、一次3KB

3)每次磁盘寻址时间和内存推送给CPU并对比的时间如下:
内存将数据传送给CPU、CPU进行运算大约需要20ns,而磁盘一次寻址需要5ms,因此要尽量保证多在内存进行对比。
在这里插入图片描述

B+树的优点

1、非叶子节点只能存储key值(只能做索引),这样每次就可以使磁盘向内存中传送更多的key值,减少总体查询的时间;
(在内存当中进行数据对比,在磁盘当中进行数据查询)
(value值大小是不可控的,因此磁盘向内存同样推送4KB的数据,在B+树中,能推送更多的节点,提供更多的key值来供内存CPU做对比,减少寻址次数)

2、叶子节点是链接在一起的,有利于区间查询

例:select * from user where key >10 and key < 18
在B树需要多次查询及寻址,而由于B+树叶子节点是链表,可以在对比之后直接顺着链表查找

总结

为什么要有B树:

在磁盘中,数据存储在磁道当中,在磁盘当中,数据寻址浪费时间;B树每一层数据较多,层数比较少,数据寻址次数少,因此寻址时间较少

B树用途:

在磁盘中使用,减少寻址时间,从而减少数据查询时间。
如何使用B树:
在磁盘中使用减少寻址次数。

为什么要有B+树:

1)非叶子节点只能存储key值(只能做索引),这样每次就可以使磁盘向内存中传送更多的key值,减少总体查询的时间;
(减少磁盘寻址的时间;在查询数据时,需要从磁盘中推送数据到内存,内存再将数据传送到CPU进行判断,判断好后再根据判断的结果在磁盘寻址;)
2)虽然红黑树是内存最优结构,但是磁盘寻址耗费时间更长,因此要减少寻址次数,尽量多让内存CPU来判断。
3)叶子节点是链接在一起的,有利于mysql数据库区间查询

B+树用途:

mysql专用底层数据结构

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值