【问题标题】:Indexing items marked as deleted索引标记为已删除的项目
【发布时间】:2013-09-20 11:42:56
【问题描述】:

由于客户要求,我需要实现以下场景:
每当用户想要删除代表文档的记录时,需要使用简单的 BOOLEAN is_deleted 条件将该特定记录标记为已删除。

Document 是存储发票、订单或报价的表格之一的通用名称。

一切都非常简单,但我想知道是否有一种方法可以索引记录以执行快速搜索并以某种方式跳过/省略已删除的项目(或者根本不需要担心性能并使用简单的 where 子句@987654323 @)。

其他解决方案/建议也将不胜感激。

【问题讨论】:

  • 如果确实会导致性能问题,您可以使用省略/包含“已删除”记录的部分索引。否则 - 让 postgres 过滤掉它们。
  • Postgresql 9.3 引入了Materialized View,这可能很有用,但是对于布尔字段,我认为对该字段的过滤不会对性能造成很大影响。
  • 部分索引除了让一些查询更快之外还有另一个好处,它们也更小,占用的缓存更少,维护它们产生的 I/O 开销更少(需要维护的条目更少)。例如。 CREATE INDEX docs_not_deleted_pidx ON docs (some_id) WHERE is_deleted IS FALSE

标签: sql postgresql search indexing


【解决方案1】:

PostgreSQL 支持部分索引。您可以执行以下操作:

create index document_id_is_deleted_idx ON document(id) where is_deleted;

如果您需要部分数据的唯一子集,您甚至可以创建唯一索引。

当然,在索引中获取正确的列是一项练习,但它非常易于管理。

【讨论】:

    【解决方案2】:

    您可能想探索的另一个选项是将这些记录移动到另一个表中,或者使用分区来分隔已删除和未删除的行(这大致相当于同一件事)。

    这将使您可以将所有感兴趣的记录保存在一个较小的表中,该表的索引与已删除记录的索引不同。

    如果您沿着分区路线走,您将拥有一个 DOCUMENTS 主表,其中 DOCUMENTS_DELETED 和 DOCUMENTS_LIVE 表继承自它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2018-11-04
      • 1970-01-01
      • 2013-04-16
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多