B树
二叉搜索树->AVL树->红黑树->B树,由于B树之前的搜索树都是内存中存数据,如果数据量过大,内存中存不下,就没有办法了。这个时候内存中存不下的时候,就想到向磁盘中存储,B树主要就是应对在磁盘上存储数据的问题
B树的主要特点:
1.搜索树的左边的子树小于当前结点key,右边的子树大于当前的结点key
2.一个结点会有多个关键字,多个孩子,但是孩子的数量总会比关键字的数量多一个
3.根节点关键字的数量[1,M-1],孩子的数量[2,M]
4.非根结点的关键字的数量[M/2-1,M-1],孩子的数量[M/2,M]
B树删除的思路:删除一个值,就去向父亲或兄弟中借值,如果兄弟也小于M/2,就直接合并
B+树
B+树是B树的优化
1.一个结点孩子的数量和关键字的数量相等
2.所有的值存储在叶子上,非叶子只需要存储关键字,作为查找索引即可
3.叶子节点增加一个指针链接起来,方便遍历
B+树在插入的时候与B树的不同:
当插入数据后需要分裂的时候,把中间那个拷贝到父亲索引,B树挪动过去,B+树拷贝过去,就是为了让所有的节点都在叶子节点
B+树一般用来做数据库的存储引擎:
主键搜索可以使用B+树结构,但是非主键搜索需要遍历所有数据,也就是全表扫描,B+树更加方便做全表扫描,所以用来做数据库的引擎
B*树
B*树就是在B+树上继续优化
1.非叶子结点的数量[2/3*M,M]
2.非叶子结点也是链接起来的
非叶子结点的数量最小是2/3M的原因:之前的B树和B+树都是满了就分裂两个,所以最小都是1/2M,但是B*树是自己如果满了,就去看兄弟满不满,兄弟不满就给兄弟,如果兄弟也满了,则新增一个结点,将我和兄弟各自拷贝1/3,这个时候我、兄弟、新节点就都是2/3M的数量