GiST 和 GIN 索引的区别

问题描述 投票:0回答:1

我正在实现一个表,其中有一列数据类型为

tsvector
,我试图了解使用哪种索引更好?

GIN 还是 GiST?

在查看postgres文档时我似乎明白了:

  • GiST 更新和构建索引的速度更快,但准确性不如 gin。

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

好吧,那么为什么有人想要一个要点索引字段而不是杜松子酒呢?如果 gist 会给你错误的结果?这一定有一些优势(外部表现)。

任何人都可以用外行的术语解释一下我什么时候想使用 GIN 与 GiST 吗?

postgresql indexing full-text-search
1个回答
142
投票

我认为我无法比手册更好地解释它:

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

  • GIN 索引查找速度大约是 GiST 的三倍

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

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

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

链接和引用请参阅 Postgres 9.4 的手册。规模和性能估计似乎已经有些过时了。 随着 Postgres 9.4 的出现,赔率已经大幅改变有利于 GIN
Postgres 9.4 的发行说明包括:

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

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

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

请注意,有些特殊用例需要其中之一。

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

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

我的粗体强调。

© www.soinside.com 2019 - 2024. All rights reserved.