文章目录
前言
为啥要使用B+Tree,而不是用普通二叉树和AVL平衡二叉树呢
一、普通二叉树
1.检索原理
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
二叉树的特点:
1、一个节点只能有两个子节点,也就是一个节点度不能超过2
2、左子节点 小于 本节点;右子节点大于等于 本节点,比我大的向右,比我小的向左
2.问题
这种方式查找:时间复杂度会再次上升
二、AVL平衡二叉树
1.检索原理
- AVL树全称G.M. Adelson-Velsky和E.M. Landis,这是两个人的人名。
- 在插入数据的时候会自动发生n多次旋转操作,旋转操作会消耗一定的性能!旋转的目的就是保证这个棵数的平衡。平衡二叉树要求左子树与左子树的高度差不能超过1
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
2.问题
- 在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响。
- 节点海量,也会造成二叉树的高度很大,会降低操作速度。
3.解决问题
我们为了减少磁盘IO的次数,就必须降低树的深度,将“瘦高”的树变得“矮胖”。
(1)每个节点存储多个元素
(2)摒弃二叉树结构,采用多叉树
红黑树:
插入顺序:2,1,4,5,3,6
当再次插入7的时候,这棵树就会发生旋转
在这个棵严格的平台树上又进化为“红黑树”{是一个非严格的平台树 左子树与左子树的高度差不能超过1},红黑树的长子树只要不超过短子树的两倍即可!
三、BTree索引
1.【B树的介绍】
B-Tree树即B树,B即Balanced,平衡的意思。
- B-Tree即B树,Balance Tree,平衡树。
- 2-3树是最简单的B树结构。
- B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是4。
- B树通过重新组织节点,降低树的高度,并且减少IO读写次数来提升效率。
- 关键字集合分布在整颗树中,即叶子节点和非叶子节点都存放数据。
https://www.cs.usfca.edu/~galles/visualization/BTree.html
2.【检索原理图】
黄色:指针,存储子节点的信息地址
红色:键值,表中记录的主键
蓝色:数据,记录表中除主键外的数据
以上图为例:若查询的数值为5:
第一次磁盘IO:根据根节点找到磁盘块1,读入内存,执行二分查找,比17小,根据指针P1,找左子树;
第二次磁盘IO:找到磁盘块2,读入内存,执行二分查找,比8小,根据指针P1,找左子树;
第三次磁盘IO:找到磁盘块5,读入内存,执行二分查找,找到5,终止。
整个过程中,我们可以看出:BTree相对于平衡二叉树降低了树的高度,缩减了节点个数,减少了I/O操作,提高了查询效率
还可以优化!让每个磁盘块存储更多的指针
四、B+Tree索引
1.【B+树的介绍】
B+Tree 即B+树:
- B+树是B树的升级版本,区别是所有数据只出现在叶子结点中,即叶只有叶子节点存放数据,非叶子节点只是叶子结点中数据的键值和指针。
- 所有的叶子结点中包含了全部数据信息,及指向含这些数据记录的指针,叶子节点之间通过指针相连,且叶子结点本身依键值的大小自小而大顺序链接。
- 由于B+树的非叶子节点不存储数据,因此每个节点可以存储更多的信息,假设每个节点能存储4个键值和指针信息,则变成B+树后其结构如下图所示:
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
2.【检索原理图】
由于B+树的非叶子节点只存储键值和指针信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+树后其结构如下图所示:
五、BTree和B+Tree比较
- 首先,B+树的查找和B树一样,起始于根节点,自顶向下遍历树。
- 不同的是,B+树中间节点不存储数据,只有键值和指针,而B树每个结点要存储键值和实际数据,这就意味着同样的大小的磁盘块B+树可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少 。
- 现代操作系统中,磁盘的存储结构使用的是B+树机制,MySQL的InnoDB引擎的存储方式也是B+树机制。
六、面试题
1.b-tree和b+tree的区别
b-tree我们称之为B树。B树是一种多路自平衡搜索树,它类似普通的二叉树,但是B书允许每个节点有更多的子节点。B树示意图如下:
B树的特点:
(1)所有键值分布在整个树中
(2)任何关键字出现且只出现在一个节点中
(3)搜索有可能在非叶子节点结束
(4)在关键字全集内做一次查找,性能逼近二分查找算法B+Tree
从图中也可以看到,B+树与B树的不同在于:
(1)非叶子节点只存储键值信息
(2)所有叶子节点之间都有一个链指针
(3)数据记录都存放在叶子节点中