【问题标题】:Why postgresql "disrespects" hash indices?为什么postgresql“不尊重”哈希索引?
【发布时间】:2016-07-03 08:32:12
【问题描述】:

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

"注意哈希索引操作目前没有 WAL 记录,所以哈希 数据库崩溃后可能需要使用 REINDEX 重建索引。 它们也不会通过流式复制或基于文件的复制进行复制。 由于这些原因,目前不鼓励使用哈希索引。”

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

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

【问题讨论】:

  • Btree 索引与哈希索引一样快。你可以自己试试。

标签: postgresql indexing


【解决方案1】:

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

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

【讨论】:

  • 但是插入和删除呢,它们和 B+ 树的选择一样快吗?
  • 在大多数情况下,只要选择好设计参数,就可以插入和删除一个元素,一读一写。只有在(非常罕见的)最坏情况下,该操作才需要写入等于树高度的次数。
猜你喜欢
  • 2010-09-28
  • 2019-03-14
  • 2023-03-04
  • 2023-03-11
  • 2014-08-27
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多