回答一个自己一直没搞明白的问题,B+树是越宽越好吗

这个问题是由mysql数据库数据保存结构引出的一个问题,mysql使用,B+树结构保存数据,其原因主要是因为B+树查询效率稳定,最大IO次数为树的高度,且同样高度的B+树比B树保存的数据更多,那么问题来了在高度一定的情况下B+树是宽度越大越好吗?想要回答这个问题我们首先要清楚增加B+树的宽度会有什么影响

首先增加树的宽度会影响到的是数据量的大小,当树的宽度增加意味着子树增加了,那保存的数据也会变多,那数据量增加会不会影响查询效率呢,答案是不会的,因为B+树的非叶子节点存储的都是索引和下一级节点的指针,查询时会先读取根节点,根据索引比较直接确定下一级节点的地址,然后读取下一级节点,再比较,直到找到叶子节点,比如需要查询59

 

回答一个自己一直没搞明白的问题,B+树是越宽越好吗_第1张图片

1)第一次访问时候访问磁盘的时候访问到了第一层找到到了key(主键)的id值59和97,且访问的59是左节点的最大数和97是右节点的最大数,判断所访问的元素是否小于等于59,是的话走左节点到达了第二层

2)第二层访问的时候,发现访问key的id值是15、44、59,且发现keyid值59是大于44且小于等于59(这里采用二分查找)所以访问第三个孩子节点

3)在访问第三层叶子节点的时候查找到keyid值51、59处,在做一个顺序的查找,然后在内部进行遍历查找,然后找到key的id值对应下的数据。

所以数据量的大小和树的宽度不会影响查询的效率

既然如此那树的宽度无限增大数据库的容量岂不是无限的吗,当然不是,那宽度最大是多少呢,这个要从单个节点的大小说起,当读取节点信息的时候实际上是从磁盘加载数据到内存中,这里有个知识点是内存加载的时候是按照页加载的,一页默认是16k,而B+树的一个节点默认是占用一页的内存,这是因为一页基本上满足了大部分数据要求,如果占用两页那每次读取节点就需要两次IO,这不仅降低了查询效率还增加了内存浪费。所以B+树一个节点的大小跟页大小是一致的也就是16k,通过这个数字再结合数据的大小基本可以算出每个节点能保存多少数据,例如按照bigint索引计算的话key值占8字节,下级索引指针占6字节,也就是14字节,那根节点最多可以存储16*1024/14=1170个索引,所以B+树的第二层最宽也就是1170个子树,第三层最宽就是1170*1170个节点

结论:当B+树的高度一定时,宽度越宽能够保存的数据越多,能够更加充分的利用磁盘,减少浪费,且并不会影响查询效率,但宽度是有上限的,当达到最大的宽度时就无法再继续增加了

你可能感兴趣的:(b树,数据库,mysql)