B树与哈希表


101

在MySQL中,索引类型为b树,访问b树中的元素的时间为对数摊销时间O(log(n))

另一方面,在中访问哈希表中的元素O(1)

为什么不使用哈希表而不是b树来访问数据库中的数据?


9
哈希表不支持范围查询,并且在操作过程中无法平稳增长或缩小。
hmakholm在Monica

3
@HenningMakholm为什么不对不需要范围查询的列进行哈希处理?
Pacerier

Answers:


113

您只能通过哈希表中的主键访问元素。这比使用树算法(O(1)而不是log(n))更快,但是您不能选择范围(之间的所有内容xy)。树算法支持这种方式,Log(n)而哈希索引可以导致全表扫描O(n)。同样,哈希索引的恒定开销通常会更大(这不是theta表示法中的因素,但仍然存在)。此外,树算法通常更易于维护,随数据增长,扩展等。

哈希索引使用预定义的哈希大小,因此最终会得到一些存储对象的“存储桶”。这些对象又被循环,以在该分区中真正找到正确的对象。

因此,如果尺寸较小,则对于小型元素来说会产生大量开销,而尺寸较大会导致进一步的扫描。

当今的哈希表算法通常可以伸缩,但是伸缩效率很低。

确实有可扩展的哈希算法。不要问我这是怎么回事-这对我来说也是一个谜。AFAIK是从不易重新哈希化的可伸缩复制演变而来的。

其称为RUSH - - [R eplication ü的nDer 小号 calable ħ因而灰化,并且这些算法被称为算法RUSH。

但是,在某些情况下,与散列大小相比,您的索引超出了可容忍的大小,因此需要重新构建整个索引。通常这不是问题,但是对于巨大的数据库,这可能需要几天的时间。

树算法的权衡很小,它们几乎适用于所有用例,因此是默认设置。

但是,如果您有一个非常精确的用例,并且确切知道将只需要什么,则可以利用哈希索引。


您能否解释索引重建的更多内容?这是否意味着在重建索引的x天中,该表在该期间完全不可用?
Pacerier,2012年

这取决于使用的数据库系统。这个问题只涉及理论上的问题。我不太了解常见数据库系统的实现细节。但通常情况并非如此,因为可以在仍使用第一个索引时建立第二个索引
Surrican 2014年

“您只能通过元素的主键访问元素”-您是指具有索引权限的列的值,无论是主键还是其他类型的索引?
马克·费舍尔

90

实际上,似乎MySQL根据以下链接使用了两种索引:哈希表或b树。

使用b树和哈希表之间的区别在于,前者允许您在使用=,>,> =,<,<=或BETWEEN运算符的表达式中使用列比较,而后者仅用于使用=或<=>运算符的相等比较


9
这不公平。最佳答案得分最低。
АндрейБеньковский

6
这正是我想要的。我关心的是它如何影响我的查询,而不是技术分析。
Ben Dehghan

是的 这个答案对我最大的帮助。
罗恩·罗斯'18

非常感谢,已经很长时间了,但是这个答案对我也有很大帮助。
Reham Fahmy

14

哈希表的时间复杂度仅对于足够大的哈希表是恒定的(需要足够的存储桶来保存数据)。数据库表的大小事先未知,因此必须立即重新整理该表,然后才能从散列表中获得最佳性能。重新哈希也很昂贵。


2
db联机时可以执行重洗吗?还是我们必须锁定表以重新哈希所有内容?
Pacerier

1
Pacerier,MySQL不支持哈希索引。从理论上讲,可以在数据库仍处于联机状态时重新散列索引(继续使用旧索引,创建新索引,完成后切换到新索引),但是我不知道如果实现它们,MySQL会怎么做哈希索引。
埃米尔·维克斯特伦(EmilVikström)2012年

3
MySQL支持哈希索引,对吗?:dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Pacerier

你似乎是对的。这对我来说是个新闻!我必须设法跟上发展的步伐:-)那么,您的回答要比我好得多,但是正如我所说的:从理论上讲这是可能的。
埃米尔·维克斯特伦(EmilVikström)2012年

顺便说一句,为什么您说“ btree可以很容易地分页到磁盘上,但是哈希表却不能”?因为简单的键查询就足够了,所以不能将哈希表存储在磁盘中吗?
和平者


0

Pick DB / OS基于哈希,并且运行良好。如今,有了更多的内存来支持高效的稀疏哈希表,并有冗余的哈希来支持适度的范围查询,我想说哈希可能仍然占有一席之地(有些人宁愿使用其他形式的非范围相似性匹配,例如通配符和正则表达式)。我们还建议复制以在内存层次结构具有较大速度差异时保持冲突链连续。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.