我在postgres数据库中的表上配置了自由文本搜索。非常简单的东西,有名字,姓氏和电子邮件。这种方法效果很好而且很快。
但是,我有时会在向表中插入新条目时遇到looong延迟,其中insert继续运行几分钟,并且还生成大量WAL文件。 (我们使用WAL文件进行复制)。
我的自由文本索引有什么需要注意的吗?像Postgres可能会出于性能原因随机重组它?我的索引目前大约400 MB。
提前致谢!
基督教
答案 0 :(得分:1)
考虑到WAL文件的大小,我怀疑你是正确的,它是导致问题的索引更新/重新平衡。但是我不得不想知道还有什么。
我建议不要在单独的列中存储tsvectors。更好的方法是在to_tsvector()的输出上运行索引。如果需要,您可以为多种语言提供多个索引。因此,我不建议采用一个名为描述的字段并将tsvector存储在desc_tsvector中,而是建议只做:
CREATE INDEX mytable_description_tsvector_idx ON mytable(to_tsvector(description));
现在,如果您需要在整个表中使用一致的搜索界面,那么使用“表格方法”有更优雅的方法。
一般而言,功能索引方法与其相关的问题少于其他任何问题。
现在你需要注意的第二件事是部分索引。如果需要,您只能索引感兴趣的记录。例如,如果我的大多数查询只检查去年,我可以:
CREATE INDEX mytable_description_tsvector_idx ON mytable(to_tsvector(description))
WHERE created_at > now() - '1 year'::interval;