B树和B+树的理解

简介: B树和B+树的理解

二叉树、AVL树、B树的概念


B树是一种多路平衡查找树,为了更加形象去理解树的概念,先来看下二叉树

image.png

二叉树是指每个节点最得意支持两个分叉,想比与单向链表来说它多了一个分支,而二叉查找树是在二叉树的基础上去增加一个规则,它的规则是左子树的所有子节点都要小于它的根节点,而右子树的所有子节点都要大于它的根节点

image.png

二叉查找树有可能会出现斜树的问题,导致时间复杂度会增加,因此引入一个叫平衡二叉树的一个机制,它具有二叉查找树的所有特点,同时增加了一个规则,左右两个子树的高度差的绝对值不能超过1,平衡二叉树为了达到这样一个平衡,所以它会引入一个这样左旋和右旋的机制去实现树的平衡

image.png

而B树它是一种多路平衡查找树,它满足平衡二叉树的规则,同时它也可以有多个子树,子树的数量呢取决于它的关键字数量,如图,根结点有两个关键字3和5,那么它能够拥有的子路数量等于关键字的数量加上1,因此从这个特征来看,在存储同样数据量的情况下,平衡二叉树它的高度一定大于B树的高度,而所为的B+树是在B树的基础上做了增强,最大区别有两个点


  1. B树的数据存储在每个节点上,而B+树的数据是存储在叶子节点上,并且通过链表的方式把叶子节点的所有数据进行一个链接


  1. B+树的子路数量等于关键字的数量


image.png

如图这是一个B树,从B树的结构上可以看到每个节点都会存储数据

image.png

如图,这是一个B+树的结构,B+树的所有数据是存储在叶子节点上的,并且叶子节点的数据是用双向链表来关联,这是属于InnoDB里面一个特征


B树和B+树的应用场景


B树和B+树一般应用在文件系统和数据系统中,用来减少磁盘IO所带来的性能损耗的一个机制的,以Mysql中的InnoDB为例,当我们通过select语句去查询一条数据的时候,InnoDB需要取磁盘读取数据,而这个过程会涉及到磁盘IO以及磁盘的随机IO

image.png

如图,我们知道磁盘IO的性能是特别低的,特别是随机磁盘的IO,为了更好的去理解为什么性能低,我们来看下磁盘IO的工作原理,首先系统会把数据的逻辑地址传给磁盘,磁盘控制线路按照寻址的逻辑把逻辑地址翻译成物理地址,也就是确定要读取的数据在哪个磁道,哪个扇区,为了读取这个扇区的数据,需要把磁头放在扇区上面,


为了实现这样一个点,磁盘会不断的去旋转,把目标的扇区旋转到磁头下面,使得磁头能够去找到对应的磁道,这里会涉及到寻道的时间,以及旋转时间的损耗,很明显磁盘IO这个过程的性能开销是非常大的,特别是查询的数据量比较多的情况下,所以在InnoDB里面,对存储在磁盘上的数据建立一个索引,然后把索引数据,以及索引所对应的磁盘地址以B+树的方式进行存储

image.png

当我们需要查找目标数据的时候,根据索引从B+树中去查找目标数据就行了,由于B+树子路比较多,所以只需要较少次数的1磁盘IO就能够查到目标数据,



为什么用B树或B+树来做索引结构


因为AVL树的高度要比B树或者B+树的高度更高,而高度就意味着磁盘IO的数量,所以为了减少磁盘IO的次数,所以文件系统或者数据库才会使用B树,或者B+树来做索引结构



相关文章
|
6月前
|
存储
第7章 神奇的树
第7章 神奇的树
|
7月前
|
存储 算法 Unix
简单介绍一些其他的树
简单介绍一些其他的树
|
存储 缓存 关系型数据库
B树与B+树
B树与B+树
56 0
B树与B+树
|
存储 缓存 算法
B树,B-树,B+树和B*树
B树,B-树,B+树和B*树
系统发育树初步剖析
1. 什么是系统发育树 2. 如何看系统发育树并确定哪些物种最相关
213 0
|
存储
你说什么是树?
你说什么是树?
122 0
你说什么是树?
|
存储
心里有点树 (一)
心里有点树 (一)
208 0
|
存储
心里有点树 (三)
心里有点树 (三)
154 0
|
Java 容器
心里有点树 (二)
心里有点树 (二)
113 0
|
存储 索引
心里有点B树
在说B树之前最好先看看2-3树, 2-3树是B树的一种特例, 什么B树, B树就是2-3树, 2-3-4 树 , 2-3-4-5... 树的统称, 而B+树又是B树的一种变形
175 0