【问题标题】:Difference between GiST and GIN indexGiST和GIN索引的区别
【发布时间】:2015-05-12 14:05:45
【问题描述】:

我正在实现一个表,该表的列的数据类型为tsvector,并且我试图了解哪种索引更适合使用?

GIN 还是 GiST?

在查看postgres documentation here 时,我似乎明白了:

  • GiST 更新和构建索引的速度更快,但比 gin 准确度更低。

  • GIN 更新和构建索引的速度较慢,但​​更准确。

好的,那么为什么有人想要一个 gist 索引字段而不是 gin?如果 gist 会给你错误的结果?这一定有一些优势(外部性能)。

谁能通俗地解释一下我什么时候想使用 GIN 和 GiST?

【问题讨论】:

  • 总是提供您的 Postgres 版本。 GIN 在 Postgres 9.4 中得到了重大改进

标签: postgresql indexing full-text-search


【解决方案1】:

我认为我无法比the manual 更好地解释它:

在选择使用哪种索引类型(GiST 或 GIN)时,请考虑这些 性能差异:

  • GIN 索引查找比 GiST 快大约三倍

  • GIN 索引的构建时间大约是 GiST 的三倍

  • GIN 索引的更新速度比 GiST 索引稍慢,但如果禁用快速更新支持,则速度会慢 10 倍 [...]

  • GIN 索引比 GiST 索引大两到三倍

链接和引用请参阅 Postgres 9.4 的手册。大小和性能估计似乎已经有点过时了。 With Postgres 9.4 the odds have shifted substantially in favor of GIN.
release notes of Postgres 9.4 包括:

  • 减少 GIN 索引大小(Alexander Korotkov、Heikki Linnakangas)[...]

  • 提高多键 GIN 查找的速度(Alexander Korotkov,Heikki 林纳坎加斯)

尺寸和性能估计已从手册中删除。

请注意,special use cases 需要其中之一。

您误解了一件事情:您永远不会使用 GiST 索引得到错误的结果。索引对哈希值进行操作,可能导致索引中的误报。这应该只与文档中大量不同的单词相关。在任何情况下重新检查实际行后,都会消除误报。 The manual:

GiST 索引是有损的,这意味着该索引可能会产生错误 匹配,并且有必要检查实际的表行 消除此类错误匹配。 (PostgreSQL 会在需要时自动执行此操作。

我的大胆强调。

【讨论】:

  • 我相信您的意思是“使用 GIN 索引永远不会得到错误的结果”,对吧?
  • @IamIC:无论是使用 GIN 还是 GiST,您都不会得到错误的结果。但我在答案中专门针对 GiST,因为 OP 在那里有错误的印象。
  • 明白。这是有道理的。
  • 谢谢各位前辈!
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2010-10-20
  • 2011-10-09
  • 2014-01-02
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多