为什么postgresql“不尊重”哈希索引?

Kiv*_*van 5 postgresql indexing

我知道 postgresql 不鼓励使用哈希索引。他们实际上说:

“注意散列索引操作目前没有 WAL 日志记录,因此在数据库崩溃后可能需要使用 REINDEX 重建散列索引。它们也不会通过流或基于文件的复制进行复制。出于这些原因,目前不鼓励使用散列索引.”

这是根本不使用它们的好论点,但我无法理解为什么 postgresql 开发人员不努力使哈希索引成为一等公民,并鼓励在某些情况下使用它们,而不是完全不鼓励这样做。

其实如果只求相等的话,hash索引应该比任何一种树都要好得多,因为它们在o(1)中进行查找、插入和删除,而平衡树自然不会比o(log( n))。在最坏的情况下,哈希索引可能适用于 o(n),但是有很多已知的技术可以避免最坏的情况。如果我是 db 引擎架构师,那么这样的论点肯定会影响我将哈希索引作为可行的替代方案的决定,但对于 postgresql,它似乎有所不同。这是否有技术原因,或者这样的决定不是出于技术动机?

Ren*_*nzo 4

树索引,例如使用 B + -树及其变体,非常高效,以至于它们被认为具有 O(c) 成本,其中 c,树的高度,是一个小常数(c = 3 或 4你可以索引数百万条记录),并且通常至少缓存一层或两层这样的树,因此大多数情况下磁盘访问次数可以等于1或2。

因此,出于实用目的,它们具有与哈希索引类似的性能,而且还具有允许范围搜索的巨大优势。