二叉树、AVL树、B树的概念
B树是一种多路平衡查找树,为了更加形象去理解树的概念,先来看下二叉树
二叉树是指每个节点最得意支持两个分叉,想比与单向链表来说它多了一个分支,而二叉查找树是在二叉树的基础上去增加一个规则,它的规则是左子树的所有子节点都要小于它的根节点,而右子树的所有子节点都要大于它的根节点
二叉查找树有可能会出现斜树的问题,导致时间复杂度会增加,因此引入一个叫平衡二叉树的一个机制,它具有二叉查找树的所有特点,同时增加了一个规则,左右两个子树的高度差的绝对值不能超过1,平衡二叉树为了达到这样一个平衡,所以它会引入一个这样左旋和右旋的机制去实现树的平衡
而B树它是一种多路平衡查找树,它满足平衡二叉树的规则,同时它也可以有多个子树,子树的数量呢取决于它的关键字数量,如图,根结点有两个关键字3和5,那么它能够拥有的子路数量等于关键字的数量加上1,因此从这个特征来看,在存储同样数据量的情况下,平衡二叉树它的高度一定大于B树的高度,而所为的B+树是在B树的基础上做了增强,最大区别有两个点
- B树的数据存储在每个节点上,而B+树的数据是存储在叶子节点上,并且通过链表的方式把叶子节点的所有数据进行一个链接
- B+树的子路数量等于关键字的数量
如图这是一个B树,从B树的结构上可以看到每个节点都会存储数据
如图,这是一个B+树的结构,B+树的所有数据是存储在叶子节点上的,并且叶子节点的数据是用双向链表来关联,这是属于InnoDB里面一个特征
B树和B+树的应用场景
B树和B+树一般应用在文件系统和数据系统中,用来减少磁盘IO所带来的性能损耗的一个机制的,以Mysql中的InnoDB为例,当我们通过select
语句去查询一条数据的时候,InnoDB需要取磁盘读取数据,而这个过程会涉及到磁盘IO以及磁盘的随机IO
如图,我们知道磁盘IO的性能是特别低的,特别是随机磁盘的IO,为了更好的去理解为什么性能低,我们来看下磁盘IO的工作原理,首先系统会把数据的逻辑地址传给磁盘,磁盘控制线路按照寻址的逻辑把逻辑地址翻译成物理地址,也就是确定要读取的数据在哪个磁道,哪个扇区,为了读取这个扇区的数据,需要把磁头放在扇区上面,
为了实现这样一个点,磁盘会不断的去旋转,把目标的扇区旋转到磁头下面,使得磁头能够去找到对应的磁道,这里会涉及到寻道的时间,以及旋转时间的损耗,很明显磁盘IO这个过程的性能开销是非常大的,特别是查询的数据量比较多的情况下,所以在InnoDB里面,对存储在磁盘上的数据建立一个索引,然后把索引数据,以及索引所对应的磁盘地址以B+树的方式进行存储
当我们需要查找目标数据的时候,根据索引从B+树中去查找目标数据就行了,由于B+树子路比较多,所以只需要较少次数的1磁盘IO就能够查到目标数据,
为什么用B树或B+树来做索引结构
因为AVL树的高度要比B树或者B+树的高度更高,而高度就意味着磁盘IO的数量,所以为了减少磁盘IO的次数,所以文件系统或者数据库才会使用B树,或者B+树来做索引结构