【问题标题】:PostgreSQL: Create index for boolean columnPostgreSQL:为布尔列创建索引
【发布时间】: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 个不同的谓词。

标签: postgresql boolean database-indexes


【解决方案1】:

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

boolean 列上的索引仅有用

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

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

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

【讨论】:

  • ((1)) 有什么作用?是“WHERE boolcolumn = TRUE”的简写吗?
  • 不,它是一个小的常数值。对于这个用例,索引什么值并不重要,重要的是索引中包含哪些行。
  • mytab((true)) 会小于 mytab((1)) 吗?
  • 我不这么认为。
猜你喜欢
  • 2015-08-07
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多