【问题标题】:What is Minimum Occupancy in B-Trees?B树的最小占用率是多少?
【发布时间】:2018-12-19 07:38:01
【问题描述】:

我对 B-Tree 概念还很陌生,我目前正在阅读可以在此处找到的课程的幻灯片: http://www-db.deis.unibo.it/courses/TBD/Lezioni/02%20-%20Indices.pdf

我读到 B 树的“最小占用率”为 50%。

这是什么意思?这是最低入住率的好百分比吗?是否有更高/更低的最低入住率更好?

谢谢

【问题讨论】:

  • 请引用并添加上下文来源。我猜你的意思是,所有节点,期望根必须至少“半满”?
  • 谢谢,我编辑了问题以包含我的来源。我认为这就是意思.. 但是节点至少半满是什么意思?

标签: mysql sql indexing b-tree b-tree-index


【解决方案1】:

此答案适用于 ENGINE = InnoDB。

出于所有实际目的,给定的 BTree 要么是“满的”,要么是 69% 满的。这不涉及单个块。

个别区块...

  • 当最初加载 BTree 按键顺序时,它将被填充到 15/16。

  • “最后一个”块可能几乎是空的——假设插入认为树被附加到。

  • 随机填充时,会出现块拆分,使两个连续块的填充率分别约为 50%。

  • 从长远来看(不断流失和/或添加)BTree,它的平均约为 69%。 (这是关于 BTree 的事实。)

  • 在事务处理过程中,可能会在块中放置额外的行副本;清理后,这些就消失了。

  • 当两个相邻的块小于半满时,代码可能会尝试合并这些块。

  • InnoDB 预先分配块,因此某些块(在任何时候)是完全空的。

一些数据库供应商为最小/最大/等占用率提供各种可调参数。 MySQL遵循KISS原则;没有什么可调整的。效果是 BTree 相当有效。此外,请注意索引(对于 InnoDB)的选择有限:

  • PRIMARY KEY 是唯一的和集群的;这里没有选项。
  • 辅助索引(如果有)是非聚集的,并且在叶节点中有PRIMARY KEY 列。也就是说,要通过辅助键定位整行,有两个 BTree 向下钻取。

经验法则(对于 InnoDB 的 16KB 块):BTree 的每个节点中大约有 100 个项目。推论:一个万亿行的表或索引在 BTree 中将有 大约 6 个级别。 (现在,这一段不是比链接中的那些公式等简单吗?)

InnoDB 采用“B+Trees”,因此顺序扫描可以从一个叶子节点遍历到下一个叶子节点。

另请参阅 Wikipedia 以了解 BTrees 的另一个讨论。

哦,回到关于 50% 的问题——那是“自然的”。想想“块分割”(又名“叶子分割”)做了什么——取一个完整的块并将其变成两个相邻的半完整块。要求 50% 以外的任何东西都是没有意义的。 (是的,你可以将一个完整的块分成 3 个,但这似乎很浪费。或者你可以在它完全填满之前进行分割,但这样做并没有什么收获。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2018-02-28
    相关资源
    最近更新 更多