首页 > 解决方案 > 在具有存储大量值的非唯一列的 postgres 中,是否可以对其进行索引并提高性能?

问题描述

我收到了大量关于越来越多用户尝试身体壮举但随后失去兴趣并离开的数据。每个用户都有一个唯一的 id。每次尝试都会被赋予一个唯一的 ID。数据以将用户与尝试(rel_user_attempts)相关联的表格形式流向我。请注意尝试分批到达,但并不总是按时间顺序。

rel_user_attempts
-----------------
id (pk)   archived    userid      attemptid (unique)
1         false       152         4001
2         false       152         4002
3         false       152         4003
4         false       19          4004
5         false       19          4005
6         false       19          4006
7         false       2409        3301
8         true        2409        3302
9         false       2409        3303
... etc

我的分析团队将执行的最常见搜索是按用户(例如用户 19)

SELECT * FROM rel_user_attempts WHERE userid=19 AND archived=false;

在具有存储范围广泛的值的非唯一列(用户 ID)的 postgres 中,是否可以对其进行索引并提高性能?

标签: postgresqlindexing

解决方案


使用任何索引的好处,或者 Postgres 是否可能选择使用特定索引,取决于几件事,其中包括基础数据的基数。当用于往往具有唯一或相对唯一值的列时,索引最有帮助。您可能会发现以下索引在这里很有帮助:

CREATE INDEX idx ON rel_user_attempts (userid, archived);

至少从您的样本数据来看,该列上的基数userid似乎不高,但至少有点高。鉴于这archived是一个布尔列,假设真/假值以相等的概率出现,则该列的基数会很低。但是,我们仍然可以将它包含在上述索引中,以完全覆盖WHERE您查询的子句。考虑添加上述索引,然后检查执行计划。


推荐阅读