我有一个包含一个 boolean 列的表。
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
谁能给我解释一下?
最佳答案
只有当 PostgreSQL 认为这样会更便宜时才会使用索引。
boolean
列上的索引,只能取两个可能的值,几乎永远不会被使用,因为顺序读取整个表比在索引上使用随机 I/O 和如果必须检索表的高百分比。
boolean
列上的索引只是有用的
在数据仓库场景中,它可以通过位图索引扫描与其他索引结合。
如果表中只有一小部分的值为
TRUE
(或FALSE
)。在这种情况下,最好创建一个部分索引,例如CREATE INDEX ON mytab((1)) WHERE boolcolumn;
该索引值是常量 1(索引表达式不是列引用或看起来像函数调用,出于语法原因,必须在额外的一对括号中)。这个索引唯一相关的部分是它的
WHERE
条件。常量 1 存在只是因为必须对某物 进行索引。如果您有一个(小)列可以代替使用,那就去做吧。
关于PostgreSQL:为 boolean 列创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42972726/