美文网首页
为什么MySQL用B+树而不用B树?

为什么MySQL用B+树而不用B树?

作者: 面向对象架构 | 来源:发表于2022-11-15 01:59 被阅读0次

    对比分析

    B树和B+树相比,有两个最核心的区别:

    • B树没有内部节点和叶子结点的区分,它的每个节点都是即存了key又存了data。
    • 由于没有内部节点和叶子结点的区分,使得B树没有将叶子结点用链表串联起来的结构。

    因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO 操作变多,查询性能变低。

    这两个区别给B树带来了两个检索的特点:

    • 进行单个key查询时,B树最快可以在O(1)的时间代价内就查到。而从平均时间代价来看,会比B+树稍快一些。但波动会比较大,因为每个节点既存key又存data会使得树变高,底层的节点的IO次数就会变多。
    • 进行范围查询时,由于缺乏叶子结点的连接,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的IO问题,效率不如B+树。

    B+树叶子和非叶子结点的数据页都是16k,且数据结构一致,区别在于叶子节点放的是真实的行数据,而非叶子结点放的是主键和下一个页的地址。

    B+树一般有两到三层,由于其高扇出,三层就能支持2kw以上的数据,且一次查询最多1~3次磁盘IO,性能也还行。

    存储同样量级的数据,B树比B+树层级更高,因此磁盘IO也更多,所以B+树更适合成为mysql索引。

    索引结构不会影响单表最大行数,2kw也只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。

    单表最大值还受主键大小和磁盘大小限制。

    总结一下

    存在大量范围查询的场景,适合使用B+树(比如数据库);
    而对大量单个key查询的场景,可以考虑B树(比如NOSQL的MongoDB)

    相关文章

      网友评论

          本文标题:为什么MySQL用B+树而不用B树?

          本文链接:https://www.haomeiwen.com/subject/nlwjxdtx.html