首页 > 解决方案 > 如何在布尔列上创建索引

问题描述

我的数据库表有一个主键和许多整数列以及一个名为 paused 的布尔列,它不在主键中。该表只能容纳几百行,但我需要非常定期地查询布尔列。我需要知道布尔暂停列中的任何行是否为真,如果有一行为真,我将返回真,如果全部为假,我将返回假。

我应该在布尔列上创建一个索引吗?该语法是什么样的,或者是否有任何其他方法可以优化该查询?

CREATE TABLE IF NOT EXISTS pause_metrics (
    consumer TEXT NOT NULL,
    timstamp TIMESTAMP NOT NULL,
    idle_counter INTEGER NOT NULL,
    paused BOOLEAN DEFAULT FALSE NOT NULL,
    PRIMARY KEY(consumer)
);

标签: postgresql

解决方案


支持以下查询:

SELECT paused 
from pause_metrics
where paused  
limit 1;

过滤索引将是最有效的方法:

create index idx_paused on pause_metrics(paused)
where paused;

索引中的实际列并不重要,重要的部分是where paused它只索引具有paused = true.

要确定是否所有行都有paused = false,可以使用存在查询:

select not exists (SELECT 1 from pause_metrics where paused limit 1) as all_active

这将利用过滤后的查询,并且应该很快。


推荐阅读