我已经在我的 postgres 数据库中的表上配置了自由文本搜索。很简单的东西,名字,姓氏和电子邮件。这很好用而且速度很快。
但是,在将新条目插入表时,我有时会遇到很长的延迟,其中插入会持续运行几分钟并且还会生成巨大的 WAL 文件。(我们使用 WAL 文件进行复制)。
我的自由文本索引有什么需要注意的吗?像 Postgres 可能出于性能原因随机重组它?我的索引目前大约 400 MB 大。
提前致谢!
基督教
我已经在我的 postgres 数据库中的表上配置了自由文本搜索。很简单的东西,名字,姓氏和电子邮件。这很好用而且速度很快。
但是,在将新条目插入表时,我有时会遇到很长的延迟,其中插入会持续运行几分钟并且还会生成巨大的 WAL 文件。(我们使用 WAL 文件进行复制)。
我的自由文本索引有什么需要注意的吗?像 Postgres 可能出于性能原因随机重组它?我的索引目前大约 400 MB 大。
提前致谢!
基督教
鉴于 WAL 文件的大小,我怀疑您是对的,这是导致问题的索引更新/重新平衡。但是我不得不想知道还有什么事情发生。
我建议不要将 tsvectors 存储在单独的列中。更好的方法是在 to_tsvector() 的输出上运行索引。如果需要,您可以为多种语言创建多个索引。因此,我建议不要使用触发器来获取一个名为 description 的字段并将 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;