前几天面试被问到了,没答好,记录一下:
首先说红黑树为什么不行:
1.红黑树必须存在内存里的,数据库表太大了,存不进去。
2.即使你找到了把红黑树存进硬盘的方法,红黑树查找一个节点最多要查logN层,每一层都是一个内存页(虽然你只是想找一个节点,但硬盘必须一次读一个页。。),那么一共logN次IO,伤不起阿!
所以我们必须考虑减少树的层数来减少IO次数从而加快查询、修改数据库效率,b和b+树都符合这样的性质,它们每个节点的孩子都很多(几十~几千),所以整个树的高度可以压的很低。
比如100000000数据,每个节点有1000个孩子,那么log 1000(100000000)<3,3层就足够存了!
先讲下b树和b+树的区别:
b树的所有节点都是数据节点,但b+树只有叶子节点是数据节点,非叶子(内部)节点只起导向作用,不存储实际数据。
b+树的所有数据节点都在最下层(叶子节点层),相邻节点有链表相连。
注意磁盘读数据读一个字节和读10个字节和读一页时间相差不大的(因为磁盘查找时间大多数都花在寻道上,旋转基本不费时)
再说b树为什么不如b+树:
1.b树的内部节点都是存储实际数据的,比如一个节点是一个页4096字节,其中每条数据128字节,那么一个节点只能存32个数据项,那么对应的孩子节点数最多为33个,这显然不够用。而b+树内部节点只作为导向作用,只存一个整数就可以,4096/4=1024个数据项。这样b+树的每个节点的孩子数更多,整个树的高度就更低,大大增加查询效率。
2.b+树的叶子节点有链表相连,适合范围查询,因为相邻页直接读取就好了。但b树做不到这一点。
就简单说这些。
来源:https://www.cnblogs.com/FdWzy/p/12578939.html