我正在使用 Postgres。该表看起来像这样:
tran_id SERIAL PRIMARY KEY,
account_id integer NOT NULL CONSTRAINT fk_account_id REFERENCES base.account(account_id) ON DELETE CASCADE,
tran_type base.my_enum not null,
tran_note varchar(64) not null,
process_id integer not null,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
我感兴趣的是能够快速找到只有process_id
0 的行。该值意味着该行正在等待某种处理,非 0 行基本上是我不想存档的旧日志,因为应用程序也需要查找特定帐户的交易数量。因此将已处理和待处理的数据放在同一个表中很方便。 但是,我对能够快速找到该字段不是 0 的行不感兴趣,并且我不想使用资源来索引这些其他值。
在一个实现中,该表有近 20 万个账户,每个账户平均约 200 笔交易,因此约 4000 万行,或多或少。在任何给定时间,可能有几十个新交易要处理,即WHERE process_id = 0
. 处理后, 将process_id
更新为 0 以外的值。
我永远不会搜索process_id
除 0 以外的其他值。因此,我有兴趣拥有一个仅指向该值为 0 的行的索引,而不必理会其他值,以便索引更紧凑、更快。这可能吗?
您可以创建一个包含表的所有列的部分索引: