Answers:
您只能通过哈希表中的主键访问元素。这比使用树算法(O(1)
而不是log(n)
)更快,但是您不能选择范围(和之间的所有内容x
y
)。树算法支持这种方式,Log(n)
而哈希索引可以导致全表扫描O(n)
。同样,哈希索引的恒定开销通常会更大(这不是theta表示法中的因素,但仍然存在)。此外,树算法通常更易于维护,随数据增长,扩展等。
哈希索引使用预定义的哈希大小,因此最终会得到一些存储对象的“存储桶”。这些对象又被循环,以在该分区中真正找到正确的对象。
因此,如果尺寸较小,则对于小型元素来说会产生大量开销,而尺寸较大会导致进一步的扫描。
当今的哈希表算法通常可以伸缩,但是伸缩效率很低。
确实有可扩展的哈希算法。不要问我这是怎么回事-这对我来说也是一个谜。AFAIK是从不易重新哈希化的可伸缩复制演变而来的。
其称为RUSH - - [R eplication ü的nDer 小号 calable ħ因而灰化,并且这些算法被称为算法RUSH。
但是,在某些情况下,与散列大小相比,您的索引超出了可容忍的大小,因此需要重新构建整个索引。通常这不是问题,但是对于巨大的数据库,这可能需要几天的时间。
树算法的权衡很小,它们几乎适用于所有用例,因此是默认设置。
但是,如果您有一个非常精确的用例,并且确切知道将只需要什么,则可以利用哈希索引。
实际上,似乎MySQL根据以下链接使用了两种索引:哈希表或b树。
使用b树和哈希表之间的区别在于,前者允许您在使用=,>,> =,<,<=或BETWEEN运算符的表达式中使用列比较,而后者仅用于使用=或<=>运算符的相等比较。
哈希表的时间复杂度仅对于足够大的哈希表是恒定的(需要足够的存储桶来保存数据)。数据库表的大小事先未知,因此必须立即重新整理该表,然后才能从散列表中获得最佳性能。重新哈希也很昂贵。