如果不需要范围查询,B+-tree 与 Hash 相比对于内存数据库有什么优势吗?

Does B+-tree have any advantages for an in-memory database compared to Hash if no range query is needed?

如果两者都经过精心设计和编程。 如果不需要范围查询,B+树对于内存数据库相比Hash有什么优势吗?

不仅范围搜索,B-tree(或类似B+的变体)还可以容纳部分键搜索(即你知道前缀但不知道整个键值的地方),排序遍历,并轻松允许重复(哈希索引通常强制唯一性)。

哈希索引可能会使用更少的内存(b 树总是空的 space)。

哈希 table 可以静态分配(大小不变)或动态分配。如果您知道要以合理的准确性存储多少键值,则静态是最好的。动态分配的散列 tables 将浪费 space unless/until 新的桶被填满。 B 树根据需要自然生长。

如果散列table太小或者散列算法较差,就会发生冲突,需要链接。这将增加查找和插入时间。选择最好的散列算法在一定程度上取决于被索引的数据类型,因此几乎不可能有一个对所有事物都最佳的通用散列算法。 B树没有这个问题。