Postgresql
很少更新和很多插入的索引方法
我正在使用帶有 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 維護往往很昂貴,特別是對於具有許多可索引元素的列,即在您的情況下有很多單詞。特別是,如果您的行很大並且您批量插入,您可能需要提高
work_mem
設置。對於非常大的負載(表的大部分),刪除索引並在之後重新創建它可能是值得的。
雖然 15k 行分佈在一天內,但這根本不成問題。
最後,全文搜尋部分有一整章介紹 GIN 和 GiST 的性能。一般適用。讀這個。
它的要點(沒有雙關語):GIN 更大且維護成本更高,但對於大多數查找來說更快(特殊例外適用於 pg_trgm)。由於添加
FASTUPDATE
寫入的成本僅略高一些。