PostgreSQL:GIN或者GiST索引?
时间:2020-03-05 18:41:54 来源:igfitidea点击:
从我能找到的信息中,它们都解决了同样深奥的问题,例如数组包含和交集(&&,@>,<@等)。但是,我将对何时使用一种或者另一种(或者两种都不可行)的建议感兴趣。
PostgreSQL文档中有关于此的一些信息:
- GIN索引查找速度比GiST快三倍
- GIN索引的构建时间比GiST长三倍
- GIN索引的更新速度比GiST慢十倍
- GIN索引是GiST的二到三倍
但是,我特别想知道当内存与索引大小的比例开始变小时是否会对性能产生影响(即,索引大小变得比可用内存大得多)?在#postgresql IRC频道上有人告诉我GIN需要将所有索引保留在内存中,否则它将不起作用,因为与B-Tree不同,它不知道要从磁盘中读取哪个部分一个特定的查询?问题是:这是真的吗(因为我也被告知与此相反)? GiST是否有相同的限制?使用这些索引算法之一时,我还应该注意其他限制吗?
解决方案
回答
首先,我们是否需要将它们用于文本搜索索引编制? GIN和GiST是专门针对某些数据类型的索引。如果我们需要索引简单的char或者整数值,则通常的B树索引是最好的。
无论如何,PostgreSQL文档在GIST上有一章,在GIN上有一章,我们可以在其中找到更多信息。
最后但并非最不重要的一点是,找到最佳方法的最佳方法是生成样本数据(实际情况需要尽可能多的数据),然后创建GIST索引,测量创建索引所需的时间,插入新值,执行示例查询。然后删除索引,并对GIN索引执行相同操作。比较这些值,我们将根据数据获得所需的答案。