PostgreSQL 三元组 GIST 与 GIN 索引

P.P*_*ter 11 postgresql full-text-search postgresql-9.1

我有一个 PostgreSQL 9.1 数据库,其中包含 10M+ 行和一些需要相似性和类似%word%搜索的文本字段,所以我决定使用 trigram 索引。

最初,我开始使用 GIN 索引,但现在我想知道我是否应该使用 GIST。

该理论说:

  • GIN 索引查找速度大约是 GiST 的三倍
  • GIN 索引的构建时间大约是 GiST 的三倍
  • GIN 索引的更新速度比 GiST 索引稍慢,但如果禁用快速更新支持,则大约慢 10 倍(有关详细信息,请参阅第 58.4.1 节)
  • GIN 索引比 GiST 索引大两到三倍

我试图同时创建GINGIST索引,并在实践中发现以下内容(在我的数据集上):

  • 对于LIKE '%word%'查询,GIN 的速度与第一次 GIST 大致相同(甚至慢 5-20%)(当查询中的三元组索引尚未缓存时)。
  • 对于LIKE '%word%'查询,如果最近搜索了查询中的三元组,GIN 大约比 GIST 快5倍。无论缓存如何,GIST 始终具有相同的速度。
  • 对于% 'word'(相似性)查询,GIN 大约比 GIST5-8倍,具体取决于索引的缓存性。
  • GIN比 GIST约 10% 。但是,如果UPDATE表中有语句,它似乎增长得更快。除非,当然,我VACUUM FULL经常不够。

所以我看到了理论和实践之间的一些差异:

  1. 速度:GIST 通常更快,除了 GIN 完全在内存中(你能提前确保吗?),即使这样也只用于LIKE '%word%'查询。
  2. 尺寸:GIN 实际上更小。这是三元组索引的典型情况还是我的情况是异常值?
  3. 9.4 中的行为可能会显着不同吗?
  4. 最后一个问题:如果每天有大约 10-50k 条UPDATE语句和 5-10k 条INSERT语句,使用 GIN 是否明智,每周VACUUM可能是合理的(周末使用不多),还是真的会伤害UPDATEINSERT性能?