PostgreSQL:为 boolean 列创建索引

标签 postgresql boolean database-indexes

我有一个包含一个 boolean 列的表。

productid integer
isactive boolean

当我执行查询时

SELECT productid   
    FROM 
    product  
    WHERE ispublish
    LIMIT 15 OFFSET  0

enter image description here

之后,我为 ispublish 列创建了一个索引:

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish)

并重新执行

SELECT productid   
       FROM 
       product  
       WHERE ispublish
       LIMIT 15 OFFSET  0

结果:

enter image description here

=> 没有区别

我试过以下方法,但结果是一样的:

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish)

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish)

CREATE INDEX idx_product_ispublish ON product (ispublish) WHERE ispublish is TRUE

谁能给我解释一下?

最佳答案

只有当 PostgreSQL 认为这样会更便宜时才会使用索引。 boolean 列上的索引,只能取两个可能的值,几乎永远不会被使用,因为顺序读取整个表比在索引上使用随机 I/O 和如果必须检索表的高百分比。

boolean 列上的索引只是有用的

  1. 在数据仓库场景中,它可以通过位图索引扫描与其他索引结合。

  2. 如果表中只有一小部分的值为 TRUE(或 FALSE)。在这种情况下,最好创建一个部分索引,例如

     CREATE INDEX ON mytab((1)) WHERE boolcolumn;
    

    该索引值是常量 1(索引表达式不是列引用或看起来像函数调用,出于语法原因,必须在额外的一对括号中)。这个索引唯一相关的部分是它的 WHERE 条件。常量 1 存在只是因为必须对某物 进行索引。如果您有一个(小)列可以代替使用,那就去做吧。

关于PostgreSQL:为 boolean 列创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42972726/

相关文章:

sql - Django 慢查询性能提升

python - 跨多个分组重用相同的查询?

MySQL/InnoDB : more optimal to have two non-unique index columns or combine them in unique primary key?

mysql - MySQL 可以为单个查询使用多个索引吗?

sql-server - 一周大约有 7000 万次插入。我应该在我的列上使用什么索引?

sql - PostgreSQL:在相关子查询中选择动态列

ruby-on-rails - Rails 在 list 模型中重新排列订单

file - Linux 上的文本文件之间的 boolean 差异?

python - 我不明白 Python 中的 boolean 值

Python - Pandas - DataFrame - 根据条件将单列分解为多个 boolean 列