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 ispublish
、WHERE ispublish = TRUE
和 WHERE 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表索引