Postgresql

很少更新和很多插入的索引方法

  • July 21, 2013

我正在使用帶有 pg_trgm 副檔名的 Postgresql 9.1。我需要在基於文本的欄位上創建索引。我不需要全文搜尋,我使用ILIKE查詢來進行搜尋。

我會使用和索引pg_trgm,但沒有太多經驗。我會有很多報表(每天約 15000 條)和很少的報表(一周可能有 1 或 2 條)。gin``gist``INSERT``UPDATE

gin此類表上的索引的索引更新成本是多少?還是gist更合適?

pg_trgm 模組的手冊在這里為您的問題提供了一些建議:

根據經驗,GIN 索引的搜尋速度比 GiST 索引快,但建構或更新速度較慢;所以 GIN 更適合靜態數據,GiST 更適合經常更新的數據。

GIN 索引的FASTUPDATE特性(在 Postgres 8.4 中引入,預設為 ON)對你來說應該很有趣。插入(和更新)儲存在掛起列表中,並在以後的批量操作中集成到索引中VACUUM。使這些操作更快,因為直接 GIN 維護往往很昂貴,特別是對於具有許多可索引元素的列,即在您的情況下有很多單詞。

此處的手冊中有關 GIN 與 GiST 的更多基本建議。

特別是,如果您的行很大並且您批量插入,您可能需要提高work_mem設置

對於非常大的負載(表的大部分),刪除索引並在之後重新創建它可能是值得的。

雖然 15k 行分佈在一天內,但這根本不成問題。

最後,全文搜尋部分有一整章介紹 GIN 和 GiST 的性能。一般適用。讀這個。

它的要點(沒有雙關語):GIN 更大且維護成本更高,但對於大多數查找來說更快(特殊例外適用於 pg_trgm)。由於添加FASTUPDATE寫入的成本僅略高一些。

引用自:https://dba.stackexchange.com/questions/46685