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

postgresql – 具有异构数据类型的3个字段的多列索引,第1张

概述我有一个包含3个字段的postgres表: > a:postgis几何 > b:array varchar [] > c:整数 我有一个涉及所有这些问题的查询.我想添加一个多列索引来加速它,但我不能因为它们的性质而不能将3个字段放在同一个索引下. 这种情况下的策略是什么?添加3个索引gist,gin和btree以及postgres将在查询期间使用它们吗? 单列索引 首先,Postgres可以在单个 我有一个包含3个字段的postgres表:

> a:postgis几何
> b:array varchar []
> c:整数

我有一个涉及所有这些问题的查询.我想添加一个多列索引来加速它,但我不能因为它们的性质而不能将3个字段放在同一个索引下.

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

解决方法 单列索引

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

多列索引

拥有完美匹配的multicolumn index仍然更快,但不是数量级.
由于你想要包含一个数组类型,我建议使用GIN索引.对于数组类型的通用GiST索引,缺少AFAIK运算符类. (整数数组的例外是intarray.)

要包含整数列,首先安装附加模块btree_gin,它提供必要的GIN运算符类.每个数据库运行一次:

CREATE EXTENSION btree_gin;

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

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

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

A multicolumn GIN index can be used with query conditions that involve
any subset of the index’s columns. Unlike B-tree or GiST,index search
effectiveness is the same regardless of which index column(s) the
query conditions use.

最近邻搜索

由于您包含PostGis几何类型,因此您可能想要执行nearest neighbour search,您需要GiST索引.在这种情况下,我建议两个索引:

CREATE INDEX tbl_ac_gist_IDx ON tbl USING GiST(a,c);  -- geometry typeCREATE INDEX tbl_bc_gin_IDx  ON tbl USING GIN(b,c);

您可以将整数列c添加到其中一个或两个.这取决于.
为此,您需要分别为btree_ginbtree_gist或两者.

总结

以上是内存溢出为你收集整理的postgresql – 具有异构数据类型的3个字段的多列索引全部内容,希望文章能够帮你解决postgresql – 具有异构数据类型的3个字段的多列索引所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1161793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存