对非索引列的查询将导致O(n),因为它必须搜索整个表。由于二进制搜索,添加索引允许O(log n)。有没有办法让数据库使用相同的技术来实现O(1)哈希表使用(或者可能是另一种方式),如果你搜索一个唯一的密钥?
答案 0 :(得分:2)
在某些情况下,某些rdbms支持基于散列的索引。例如,MySQL支持语法CREATE INDEX indexname USING HASH ON tablename (cols…)
,但前提是命名表存储在内存中,而不是存储在磁盘上。集群表是一种特殊情况。
我认为反对在rdbms中广泛使用哈希索引的主要原因是它们的扩展性很差。由于磁盘I / O很昂贵,因此非常精简的索引需要大量I / O才能获得很少的信息增益。因此,您更喜欢一个相当密集的索引(例如,始终将填充部分保持在⅓和between之间),这在散列冲突方面可能存在问题。但更有问题的是:当您插入值时,这样的密集索引可能会变得太满,并且您必须经常增加哈希表的大小。这样做意味着完全重建哈希表。这是一项昂贵的操作,需要大量磁盘I / O,并且可能会阻止该表上的所有并发查询。不值得期待。
另一方面,B树可以在没有太多开销的情况下延长。即使增加其深度,这是与散列表大小的扩展最接近的类比,也可以更便宜地完成,并且将不那么经常地需要。由于B树往往很浅,而且由于磁盘I / O往往会超出你在内存中所做的任何事情,因此它们仍然是大多数实际应用的首选解决方案。更不用说它们提供了对值范围的廉价访问这一事实,这是哈希无法实现的。