PostgreSQL:为布尔列创建索引

Posted

技术标签:

【中文标题】PostgreSQL:为布尔列创建索引【英文标题】:PostgreSQL: Create index for boolean column 【发布时间】:2017-08-15 19:28:30 【问题描述】:

我有一个包含一个布尔列的表。

productid integer
isactive boolean

当我执行查询时

SELECT productid   
    FROM 
    product  
    WHERE ispublish
    LIMIT 15 OFFSET  0

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

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish)

然后重新执行

SELECT productid   
       FROM 
       product  
       WHERE ispublish
       LIMIT 15 OFFSET  0

结果:

=> 没有区别

我已经尝试了以下,但结果是一样的:

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

谁能给我解释一下?

【问题讨论】:

试试CREATE INDEX ... ON product (productid) WHERE ispublish - 这应该会触发仅索引扫描(对于您的特定查询;至少在大多数情况下:这取决于您有多少行 f.ex.)。 -- 部分索引的WHERE 子句中的谓词必须 匹配查询的谓词才能使用。 WHERE ispublishWHERE ispublish = TRUEWHERE ispublish IS TRUE 是 3 个不同的谓词。 【参考方案1】:

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

boolean 列上的索引仅有用

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

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

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

【讨论】:

((1)) 有什么作用?是“WHERE boolcolumn = TRUE”的简写吗? 不,它是一个小的常数值。对于这个用例,索引什么值并不重要,重要的是索引中包含哪些行。 mytab((true)) 会小于 mytab((1)) 吗? 我不这么认为。

以上是关于PostgreSQL:为布尔列创建索引的主要内容,如果未能解决你的问题,请参考以下文章

您如何计算在大型 Postgresql 表上创建索引的时间?

性能调优:为布尔列创建索引

如何快速掌握 Navicat for PostgreSQL表索引

带表达式的多列索引(PostgreSQL 和 Rails)

哪个 Postgresql 索引对于基于相似性查询的文本列最有效

PostgreSQL 可以索引数组列吗?