“mysql中常用的数据库搜索引擎InnoDB,其索引通过B+Tree的方式进行构建。”
实在想不起来B+Tree是怎么一回事了。以点带线,将涉及到的数据结构一起复习一下。
文章目录
数据结构定义
数据结构
|
定义 |
---|---|
二叉树 | 每个节点最多有两个子树 |
二叉排序树 | 又叫二叉搜索树。在二叉树的基础上,递归定义 任意子树根节点大于其左子树最大值小于右子树最小值. 左<根<右 |
平衡二叉树 | 在二叉排序树的基础上, 递归定义 任意节点 左右子树的高度差≤1. |
红黑树 | 在二叉排序树的基础上,递归定义 见下方 |
BTree | B-Tree 同一个东西。见下方 |
B+Tree | 见下方 |
如果插入的是有序序列, 二叉排序树的效率降低为O(n). 所以推出 平衡二叉树
红黑树
定义
- 左中右: 前提是一棵二叉搜索树(左<中<右)
- 根、叶黑: 根节点和叶子结点都是黑色
- 不红红: 不存在两个红色节点有直接父子关系
- 黑路同: 任意节点到所有叶子节点经过的黑色节点数相同
使命
红黑树并不是在平衡二叉树的基础上定义的。
由于平衡二叉树左右子树高度差≤1,要求过于严格。虽然查询效率较高,但插入、删除时,调整频繁, 因此引入红黑树。
由于不红红和黑路同的性质可以推断出:红黑树左右子树最长路径节点数不超过最短路径的2倍。
相对于平衡二叉树,插入、删除效率有所提升。
BTree
BTree 就是多路查找树(一个节点内可以有多个元素),每个元素都有左右子树。 2阶BTree, 退化成平衡二叉树
定义
-
有序 1. 结点元素内有序 2. 元素的左子树都小于它,右子树都大于它
-
平衡 所有的叶结点都在同一层
-
节点限制 m阶BTree
根节点至少有1个元素,2个分支
其他节点 至少有(m+1)/2个分支, (m-1)/2个元素(左右间隙肯定要比元素数多1)
所有节点元素数<m, 分支数≤m。 所有叶子节点在同一层上
使命
数据是存储在磁盘上,每次将节点读入内存,就需要一次IO操作,IO操作是比较耗时。树的高度,限制了数据的查找效率。
一次IO读取连续地址的多个字节和读取一个字节几乎没有什么差别。
通过增加节点元素数,降低树的高度 就成为了必然的选择。
一个节点可以有多个元素 每个元素左右间隙指向后续节点。将左右间隙视为左右子树。
B+Tree
定义
从BTree基础上发展而来,
- 非叶子结点直接存储索引,>左子树最大值,<=右子树最小值
- 叶结点包含全部关键字及指向相应记录的指针,非叶结点只作索引
- 所有节点元素数<m(也有地方说是<=m), 分支数≤m
- 每一个叶子节点都有指向后续叶子节点的指针