我想在包含大量数据的 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查询?或者添加一个涵盖所有潜在领域的大索引?或者有其他方法可以处理这个问题吗?
如果
vu
、tid
和 date
不是使用 =
的查询,而是使用 IN
或 BETWEEN
的查询,则最好的选择是拥有三个 B 树索引,每列一个。使用 AND
添加的其他条件只会减少行数,因此,如果仅筛选 vu
、tid
和 date
的查询速度很快,则使用 AND
添加其他条件不应导致查询速度较慢。