我对B树概念还不陌生,我目前正在阅读可在此处找到的课程的幻灯片: http://www-db.deis.unibo.it/courses/TBD/Lezioni/02%20-%20Indices.pdf
我读到B树的“最小占用率”为50%。
那是什么意思?对于最小的占用率,这是一个很好的百分比吗?拥有更高/更低的最低入住人数更好吗?
谢谢
答案 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个,但这似乎很浪费。或者您可以在一个完整的块完全分割之前将其分割,但是这样做并不能带来太多好处。)