我有一个包含 3 个字段的 postgres 表:
- a : postgis 几何
- b : 数组 varchar[]
- c : 整数
我有一个涉及所有这些的查询。我想添加一个多列索引以加快速度,但我不能,因为这 3 个字段由于它们的性质而不能位于同一索引下。
这种情况下的策略是什么?添加 3 个索引 gist、gin 和 btree 以及 postgres 会在查询期间全部使用它们吗?
我有一个包含 3 个字段的 postgres 表:
我有一个涉及所有这些的查询。我想添加一个多列索引以加快速度,但我不能,因为这 3 个字段由于它们的性质而不能位于同一索引下。
这种情况下的策略是什么?添加 3 个索引 gist、gin 和 btree 以及 postgres 会在查询期间全部使用它们吗?
Postgres 可以通过位图索引扫描在单个查询中非常有效地组合多个索引。大多数时候,选择最具选择性的索引(或两个,结合位图索引扫描),其余的被过滤。一旦结果集足够窄,扫描更多索引就没有效率了。
拥有完美匹配的多列索引仍然更快,但不是数量级。
由于您想包含数组类型,我建议使用GIN索引。AFAIK,数组类型的通用 GiST 索引缺少运算符类。(数组除外。intarray
)integer
要包含该integer
列,首先安装附加模块btree_gin
,该模块提供必要的 GIN 运算符类。每个数据库运行一次:
CREATE EXTENSION btree_gin;
然后你应该能够创建你的多列索引:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
索引列的顺序与 GIN 索引无关。手册:
多列 GIN 索引可以与涉及索引列的任何子集的查询条件一起使用。与 B-tree 或 GiST 不同,无论查询条件使用哪个索引列,索引搜索的有效性都是相同的。
由于您包含 PostGisgeometry
类型,因此您可能想要进行最近邻搜索,为此您需要一个GiST索引。在这种情况下,我建议使用两个索引:
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c); -- geometry type
CREATE INDEX tbl_bc_gin_idx ON tbl USING GIN(b, c);
您可以将integer
列添加c
到其中一个或两个中。这取决于。为此,您需要一个btree_gin
或btree_gist
两个,分别。
这 3 个字段因其性质而不能位于同一索引下
哦,是的,他们可以。