关于索引:PostgreSQL:GIN或GiST索引?

关于索引:PostgreSQL:GIN或GiST索引?

PostgreSQL: GIN or GiST indexes?

从我能找到的信息中,它们都解决了相同的问题-更深奥的运算,例如数组包含和交集(&&,@>,<@等)。但是,我会对何时使用一个或另一个(或不可能)的建议感兴趣。 PostgreSQL文档中有关于此的一些信息:

  • GIN索引查找速度比GiST快三倍
  • GIN索引的构建时间比GiST长三倍
  • GIN索引的更新速度比GiST慢十倍
  • GIN索引是GiST的二到三倍

但是,我特别想知道当内存与索引大小的比例开始变小(即,索引大小变得比可用内存大得多)时,是否会对性能产生影响?在#postgresql IRC频道上,有人告诉我GIN需要将所有索引保留在内存中,否则它将不起作用,因为与B-Tree不同,它不知道要从磁盘中读取哪个部分特定查询?问题是:这是真的吗(因为我也被告知与此相反)? GiST是否有相同的限制?使用这些索引算法之一时,我还应该注意其他限制吗?


首先,您是否需要将它们用于文本搜索索引编制? GIN和GiST是专门针对某些数据类型的索引。 如果您需要索引简单的char或整数值,则通常的B树索引是最好的。
无论如何,PostgreSQL文档在GIST上有一章,在GIN上有一章,您可以在其中找到更多信息。
最后但并非最不重要的是,找到最佳方法的最佳方法是生成样本数据(尽可能多的是实际情况),然后创建GIST索引,测量创建索引所需的时间, 插入新值,执行示例查询。 然后删除索引,并对GIN索引执行相同操作。 比较这些值,您将根据数据获得所需的答案。


推荐阅读