具有异构数据类型的3个字段的多列索引

时间:2014-03-26 10:44:01

标签: postgresql indexing postgis postgresql-performance

我有一个包含3个字段的postgres表:

  • a:postgis geometry
  • b:array varchar []
  • c:整数

我有一个涉及所有这些问题的查询。我想添加一个多列索引来加快速度,但由于它们的性质,我不能因为3个字段不能归入相同的索引。

这种情况下的策略是什么?添加3个索引gist,gin和btree以及postgres将在查询期间使用它们吗?

2 个答案:

答案 0 :(得分:7)

单列索引

首先,Postgres可以使用位图索引扫描在单个查询中非常有效地组合多个索引。大多数情况下,Postgres将选择最具选择性的索引(或两个并将它们与位图索引扫描结合起来)并在位图堆扫描后过滤其余的索引。一旦结果集足够窄,扫描另一个索引就没有效率。

多列索引

完全匹配multicolumn index仍然更快,但不是数量级 由于您想要包含数组类型,我建议使用 GIN 索引。对于数组类型的通用GiST索引,缺少AFAIK运算符类。 (integer数组的例外情况为intarray。)

要包含integer列,请先安装附加模块btree_gin,该模块提供必要的GIN运算符类。每个数据库运行

CREATE EXTENSION btree_gin;

然后你应该能够创建多列索引:

CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);

索引列的顺序与GIN索引无关。 Per documentation:

  

多列GIN索引可以与涉及的查询条件一起使用   索引列的任何子集。与B-tree或GiST不同,索引搜索   无论哪个索引列都有效,效果都是一样的   查询条件使用。

最近邻搜索

由于您要包含PostGis geometry类型,因此您可能希望执行nearest neighbour search,您需要 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);

您可以将integerc添加到其中一个或两个中。这取决于。 为此,您需要分别为btree_ginbtree_gist或两者。

答案 1 :(得分:2)

  

由于其性质

,3个字段不能归入相同的索引

yes they can