B树中的最低占用率是多少?

时间:2018-07-11 09:55:38

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

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

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

那是什么意思?对于最小的占用率,这是一个很好的百分比吗?拥有更高/更低的最低入住人数更好吗?

谢谢

1 个答案:

答案 0 :(得分:0)

此答案适用于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 +树”,因此顺序扫描可以从一个叶节点移动到下一个叶节点。

有关BTree的另一讨论,另请参阅Wikipedia。

哦,回到50%的问题-那是“自然的”。考虑一下“块拆分”(又称“叶拆分”)的作用-取一整块并将其变成两个相邻的半整块。要求50%以外的任何东西都没有道理。 (是的,您可以将一个完整的块分成3个,但这似乎很浪费。或者您可以在一个完整的块完全分割之前将其分割,但是这样做并不能带来太多好处。)