我正在实现一个包含数据类型为tsvector
的列的表,我试图了解哪种索引更适合使用?
GIN还是GiST?
在查看postgres documentation here时,我似乎得到了:
GiST更新和构建索引的速度更快,而且比杜松子酒更准确。
GIN更新和构建索引的速度较慢,但更准确。
好的,那么为什么有人想要一个gist索引字段而不是杜松子酒呢?如果要点可能会给你错误的结果?必须有一些优势(外部表现)。
当我想要使用GIN与GiST时,有人可以用外行的方式解释吗?
答案 0 :(得分:62)
我认为我不能比the manual更好地解释它:
在选择要使用的索引类型,GiST或GIN时,请考虑这些 绩效差异:
- 快三倍
GIN索引查找速度比GiST快
GIN索引的构建时间比GiST大约长三倍
GIN索引的更新速度比GiST索引要慢,但如果禁用快速更新支持,则速度会慢10倍[...]
GIN索引比GiST索引大两到三倍
链接指向当前手册,引用来自版本9.4,而您的链接是版本9.1(出于某种原因?)。
手册中的尺寸和性能估算似乎略显过时 - 并且已被删除
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 Linnakangas)
请注意,special use cases需要其中一个。
您误解的一件事:您 从不 使用GiST索引获取错误的结果。索引对哈希值进行操作,可以导致索引中出现误报。这应该只与文档中的大量不同单词相关。在任何情况下重新检查实际行后,都会消除误报。 The manual:
GiST索引是有损的,这意味着索引可能会产生错误 匹配,有必要检查实际的表行 消除这种错误的比赛。 ( PostgreSQL会在需要时自动执行此操作。)
大胆强调我的。