数据库概述及系列文章索引
1. B+树
B 树相当于是一棵多叉查找树,对于一棵 m 阶的 B 树具有如下特性:
- 根节点至少有两个孩子。
- 每个中间节点都包含 k - 1 个元素和 k 个孩子,其中 m/2 <= k <= m。
- 每一个叶子节点都包含 k - 1 个元素,其中 m/2 <= k <= m。
- 所有的叶子节点都位于同一侧。
- 每个节点中的元素从小到大排列,节点当中的 k - 1 个元素正好是 k 个孩子包含的元素的值域划分。
e.g.1
显然,k-1个元素产生k个孩子。
k受限于阶数,故
在第3点分析。
2. 数据库索引:B+树 VS. 二叉树
给出e.g.1对应的二叉树:
假设对R.C建索引(index),R.C有S(R,C)种。
首先,两种树的index都有S(R,C)个(同种C多个,用间接桶),还是比较多的,故树都放外存。查询时,从外存加进内存。
B+树的比较次数大于二叉树(量级一致
),因为二叉树一个结点只有一个元素,not equal时直接左/右转,B+树如果落在一节点两个元素中间,会多比较右边界元素。
B+树磁盘IO次数小于二叉树,一个节点经常指向不同页,范围查询时,二叉树hit节点往往B+树多很多,相应IO次数也多很多。可以看出,IO次数往往跟树高成正比。
因为比较是在内存中,数据库(DB)主要看磁盘IO次数,故DB index用B+树,而非二叉树。
3. B+树作数据库的索引
DB index中的B+树往往通过调整节点大小,保证在三层,使B+树尽可能“矮胖”,index后的IO次数尽可能小。
每个节点还要保证填充度。填充度小时,往往会导致多读节点,DB index B+树节点填充度要在50%以上,这也与第1点要求
是一致的。
Reference
[1] 高频面试题:什么是B树?为啥文件索引要用B树而不用二叉查找树?,苦逼的码农,2019/11