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

2024-04-25

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

  • a:postgis几何
  • b : 数组 varchar[]
  • c:整数

我有一个涉及所有这些的查询。我想添加一个多列索引来加快速度,但我不能,因为这 3 个字段由于其性质而不能位于同一索引下。

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


单列索引

Postgres 可以在单个查询中非常有效地组合多个索引位图索引扫描。大多数时候,会选择最具选择性的索引(或两个,与位图索引扫描相结合),其余的将被过滤。一旦结果集足够窄,扫描更多索引就效率不高。

多列索引

完美匹配还是比较快的多列索引 https://www.postgresql.org/docs/current/indexes-multicolumn.html,但不是数量级。
既然你想包括一个数组类型我建议使用GIN指数。 AFAIK,数组类型上的通用 GiST 索引缺少运算符类。 (例外情况是intarray https://www.postgresql.org/docs/current/intarray.html for integer数组。)

要包括integer列,首先安装附加模块btree_gin https://www.postgresql.org/docs/current/btree-gin.html,它提供了必要的 GIN 运算符类。跑步每个数据库一次:

CREATE EXTENSION btree_gin;

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

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

索引列的顺序与 GIN 索引无关。手册: https://www.postgresql.org/docs/current/indexes-multicolumn.html

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

最近邻搜索

由于您包含了 PostGisgeometry类型,您可能想做一个最近邻搜索 https://postgis.net/workshops/postgis-intro/knn.html,为此你需要一个GiST指数。在这种情况下我建议two指标:

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 column c到其中一个或两个。这取决于。 为此,您需要btree_gin https://www.postgresql.org/docs/current/btree-gin.html or btree_gist https://www.postgresql.org/docs/current/btree-gist.html或分别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐