Postgres SQL:为布尔列创建索引

Văn*_*yễn 11 postgresql

我的表有1个布尔列.

productid integer
isactive (boolean)
Run Code Online (Sandbox Code Playgroud)

执行查询时

SELECT productid   
    FROM 
    product  
    WHERE ispublish
    LIMIT 15 OFFSET  0
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Affter我为ispublish专栏创建了索引

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish)

re execute
SELECT productid   
       FROM 
       product  
       WHERE ispublish
       LIMIT 15 OFFSET  0
result 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

=>没有差别我已经尝试但结果是一样的

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
Run Code Online (Sandbox Code Playgroud)

谁能向我解释一下?

Lau*_*lbe 45

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

boolean列上的索引仅有用

  1. 在数据仓库方案中,它可以通过位图索引扫描与其他索引组合.

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

    CREATE INDEX ON mytab((1)) WHERE boolcolumn;
    
    Run Code Online (Sandbox Code Playgroud)

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