GiST和GIN指数之间的差异

Wal*_*row 42 postgresql indexing full-text-search

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

GIN还是GiST?

通过这里查看postgres文档,我似乎得到了:

  • GiST更新和构建索引的速度更快,而且比杜松子酒更准确.

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

好的,那么为什么有人想要杜松子酒的gist索引字段呢?如果要点可能会给你错误的结果?必须有一些优势(外部表现).

当我想要使用GIN和GiST时,有人可以用外行的方式解释吗?

Erw*_*ter 72

我认为我不能比手册更好地解释它:

在选择要使用的索引类型,GiST或GIN时,请考虑以下性能差异:

  • GIN索引查找速度比GiST快三倍

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

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

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

该链接指向当前手册,引用来自版本9.4,而您的链接是版本9.1(出于某种原因?).

手册中的尺寸和性能估计似乎略显过时 - 并且已被删除.
在Postgres 9.4中,赔率大幅度上升,有利于GIN.Postgres 9.4
发行说明包括:

  • 减少GIN指数大小(Alexander Korotkov,Heikki Linnakangas)[...]

  • 提高多键GIN查找的速度(Alexander Korotkov,Heikki Linnakangas)

请注意,有一些特殊用例需要其中一个.

你误解了一件事:你从来没有用GiST索引得到错误的结果.索引对哈希值进行操作,这可能导致索引中出现误报.这应该只与文档中的大量不同单词相关.在任何情况下重新检查实际行后,都会消除误报.手册:

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

大胆强调我的.

  • @IamiC:无论是 GIN 还是 GiST,您都不会得到错误的结果。但是我在答案中特别提到了 GiST,因为 OP 在那里有错误的印象。 (6认同)
  • 我相信您的意思是“使用 GIN 索引永远不会得到错误的结果”,对吗? (2认同)