为 postgres 数据库建立索引以进行过滤的正确策略是什么

问题描述 投票:0回答:1

我想在包含大量数据的 postgres 数据库中创建索引。用例有一个前端,它应该能够过滤一些选定的字段,并在后端根据选定的过滤器构建查询。

可以过滤的字段有:vu、tid、date、amount、status、type、source、brand、group(所有字段均为 varchar,date 为 dateTime)

vu、tid 和 date 始终出现在每个查询中。查询可以如下所示:

explain analyze
SELECT 
    id,
    type ,
    amount ,
    currency,
    tid,
    vu,
    group,
    brand ,
    reference,
    receipt,
    date,
    status 
FROM tablename
WHERE vu IN ('123456') 
  AND tid IN ('123','456') 
  AND date BETWEEN '2024-10-07T00:05:10.213Z' AND '2024-12-10T14:00:00.000Z'
  AND type = 'TESTVALUE'
LIMIT 25;

问题是,如果在过滤器中选择,所有其他字段也可以出现在查询中。

我尝试创建一个过滤器来处理 vu、tid、日期以及金额,因为这是一个常见的过滤器,也经常添加:

在表名(vu,tid,日期,金额)上创建索引 idx_vu_tid_date_amount

如果没有设置过滤器或仅设置过滤器数量,这显然效果很好。但向查询添加更多字段会导致加载时间更长。

现在对此的策略是什么,添加更多索引,以覆盖所有可能的过滤器where查询?或者添加一个涵盖所有潜在领域的大索引?或者有其他方法可以处理这个问题吗?

postgresql indexing filter
1个回答
0
投票

如果

vu
tid
date
不是使用
=
的查询,而是使用
IN
BETWEEN
的查询,则最好的选择是拥有三个 B 树索引,每列一个。使用
AND
添加的其他条件只会减少行数,因此,如果仅筛选
vu
tid
date
的查询速度很快,则使用
AND
添加其他条件不应导致查询速度较慢。

© www.soinside.com 2019 - 2024. All rights reserved.