【问题标题】:How to create an Index on a boolean column如何在布尔列上创建索引
【发布时间】:2019-02-15 09:30:07
【问题描述】:

我的数据库表有一个主键和多个整数列以及一个名为 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)
);

【问题讨论】:

  • edit您的问题并为有问题的表(包括现有索引)和您要优化的查询添加create table 语句。 formatted textno screen shots
  • 对于“只有几百行”,可能永远不会使用索引开始 - 特别是如果真/假值具有均匀分布。如果有很多行带有其中一个值(例如,它们中的大多数都有paused = false),那么过滤索引可能是有意义的,例如create index on the_table (some_column) where not paused
  • 我添加了 CREATE TABLE 语句。我真的对调用这样的查询的最快方式很感兴趣。 SELECT paused from purge_consumer_metrics where paused = true limit 1;

标签: postgresql


【解决方案1】:

支持以下查询:

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

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

【讨论】:

  • 我只需要暂停列上的索引。大多数行都是假的。有没有办法快速选择所有行都是假的?索引在这里还有帮助吗?
  • @mrmannione。如果pause = true 的查询没有返回任何行,那么您就知道所有行都是错误的
  • 如果我错了,请纠正我。 1)我不需要索引吗? 2) 我最好的查询是: SELECT paused from purge_consumer_metrics where paused = true limit 1;
  • 索引用于我展示的查询。如果您需要,这取决于您的性能要求和硬件。只需测试带有和不带有索引的查询,例如使用explain (analyze, buffers) 进行测试
猜你喜欢
  • 2015-08-07
  • 2017-08-15
  • 2012-08-15
  • 2020-07-29
  • 1970-01-01
  • 2021-11-29
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多