B树
一个m阶的B树,或者空树:
- 树中每个节点至多m颗子树,也同时最多由m-1个关键字
- 如果根节点不是叶结点,那至少有两个子树
- 除根节点以外,所有非叶节点至少有【(m/2)向上取整】个子树
- 所有非终端结点都是如下结构(n,point1,key1,point2,key2….)
- n代表当前节点的key个数
- ponit0指向子树根节点的指针,且point1所指向的子树的所有节点都小于key1
- point2子树所有节点大与k1
- 所有叶子节点都在一个层次上,并且不带信息,可以看作外部节点或者是查找失败的节点,实际上这些节点并不存在
- 主要用于做文件的索引,涉及内外存的存取
查找
查找是两个操作:
- 在B-树中找节点
- 在节点中找关键字
由于B-树存储在磁盘上,则查找1在磁盘上进行的,在磁盘找到节点以后,再将这个节点读入内存进行分析在节点中找关键字。
- 在磁盘上查找的次数就是待查关键字在B树中的层次树,是决定效率的首要因素。
B+树
一个m阶B+树和m阶B树的差异:
- 有n棵子树的节点,含有n个关键字
- 所有的叶子节点包含全部关键字的信息,以及含有这个关键字记录的指针,且叶子节点本身所依关键字的大小自小而大顺序链接。
- 所有非终端节点可以看作索引,节点中仅含有其子树中的最大或最小的关键字
查找
即使在非叶子节点找到了要查找的关键字,也不停止,继续向下查找直到叶子节点
为什么 Mysql 使用B+树
- Mysql 是一种关系型数据库,区间访问是常见的一种情况
- B-树并不支持区间访问(可参见上图)
- B-树每个节点 key 和 data 在一起,则无法区间查找。
- B+树由于数据全部存储在叶子节点,并且通过指针**串**在一起,这样就很容易的进行区间遍历甚至全部遍历。
见B/B+树的区别第二点:
B+树叶节点两两相连可大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。 B+树的查询效率更加稳定,数据全部存储在叶子节点,查询时间复杂度固定为 > O(log n)。
最后第三点:
B+树更适合外部存储。由于内节点无 data 域(于是有更多的空间存放指针),每个节点能索引的范围更大更精确