我正在使用带有 *pg_trgm* 扩展名的 Postgresql 9.1。我需要在基于文本的字段上创建索引。我不需要全文搜索,我使用ILIKE
查询来进行搜索。
我会使用pg_trgm
但没有太多经验gin
和gist
索引。我会有很多INSERT
陈述(每天约 15000 个)和很少的UPDATE
陈述(一周可能是 1 或 2 个)。
gin
此类表上的索引的索引更新开销是多少?还是gist
更适合?
我正在使用带有 *pg_trgm* 扩展名的 Postgresql 9.1。我需要在基于文本的字段上创建索引。我不需要全文搜索,我使用ILIKE
查询来进行搜索。
我会使用pg_trgm
但没有太多经验gin
和gist
索引。我会有很多INSERT
陈述(每天约 15000 个)和很少的UPDATE
陈述(一周可能是 1 或 2 个)。
gin
此类表上的索引的索引更新开销是多少?还是gist
更适合?
pg_trgm 模块的手册在此处针对您的问题提供了一些建议:
GIN 索引的
FASTUPDATE
特性(在 Postgres 8.4 中引入,默认开启)对你来说应该很有趣。INSERT(和 UPDATE)存储在挂起列表中,并在以后的批量操作中集成到索引中VACUUM
。使这些操作更快,因为直接 GIN 维护往往很昂贵,特别是对于具有许多可索引元素的列,即在您的情况下有很多词。此处手册中有关 GIN 与 GiST 的更多基本建议。
特别是,如果您的行很大并且批量插入,您可能需要提高
work_mem
设置。对于非常大的负载(表的大部分),删除索引并在之后重新创建它可能是值得的。
虽然一天有 15k 行,但应该不是问题。
最后,在全文搜索部分有一整章介绍 GIN 和 GiST 的性能。一般适用。读这个。
它的要点(没有双关语意):GIN 相当大并且维护起来更昂贵,但对于大多数查找来说更快(特殊例外适用于 pg_trgm)。由于添加
FASTUPDATE
写入只是稍微贵一点。