为了问我的问题,我首先需要解释我对这两个概念的理解。
实际上,我的理解很模糊,所以如果我错了就阻止我。
索引(sql中的btree):
索引有助于关系数据库加速查询。
例如,让我们获取一个customer表,并在age列中对其进行索引。
它将建立一个二叉树,其中每个节点都有这样的结构 [age, addresses of corresponding records]
.
让我们考虑一下这个过滤器 WHERE AGE=18
,则如果数据库 N
记录和 M
对于索引列的不同值,可以在中实现此查询 O(log(M))
(二进制搜索)而不是 O(N)
哈希Map:
然后,我遇到了hashmap,查找在哪里 O(1)
? 哼!!有趣!!
如果 key, value
是其中一个条目,它将对 key
这样它就变成了一个散列,并将其作为密钥保存。还持有 value
作为价值。
当您查找 key
,它对其进行编码,从而找到散列。然后它知道在哪里可以找到散列,因为散列实际上是某种地址本身( base + index * stride
). 因此,得到那个的实际地址 value
去拿那个 value
它自己。
问题:
为什么sql数据库不使用hashmap作为唯一键并获得更好的性能?
1条答案
按热度按时间wd2eg0qa1#
哈希Map只能用于相等查询。因此,它们通常不是有用的。上的b树索引
(x)
可用于以下查询:多列哈希Map通常不能单独访问每个键。因此,上面的查询可以在
(x, y)
以及(x)
.此外,对数非常小。对于我们在数据库中处理的小数字,很难区分o(logn)和o(1)之间的区别。
而且,hashmaps在缩放时并不完全是o(1)。最终,它们开始发生冲突,并且会比内存大——这两者都会对性能产生重大影响。