今天在我的 Rails 应用程序上工作时,我注意到 paranoia gem 说应该更新索引以添加deleted_at IS NOT NULL
作为索引创建的位置(github链接)。但是我突然想到,当我确实想要 with_deleted 时,倒置条件不会从索引中受益。
这让我想知道...
我知道这有点迟钝,因为答案显然是“这取决于你需要什么”,但我试图了解多列索引、单独索引和部分索引之间的区别,我的 Web 应用程序由 PostgreSQL 支持。
基本上,我有 2 个要查询的字段:p_id 和 deleted_at。大多数时候我都在查询WHERE p_id=1 AND deleted_at IS NOT NULL
- 但有时我只查询WHERE p_id=1
。很少,我会WHERE p_id=1 AND deleted_at=1/1/2017
。
那么,我是不是更好:
- 在 p_id 上有一个索引,在 deleted_at 上有一个单独的索引?
- 在 p_id 上有一个索引但添加 'where deleted_at IS NOT NULL'?
- 在 p_id 和 deleted_at 上有一个组合索引?
注意:也许我应该提到 p_id 当前是对 p.id 的外键引用。这提醒我,在 Postgres 中,外键是否有必要也有索引(或者它们是否获得了从外键约束派生的索引 - 我已经阅读了关于此的相互矛盾的答案)?