Postgresql 在一个非唯一列存储广泛值的postgres中,是否可以对其进行索引并提高性能?

Postgresql 在一个非唯一列存储广泛值的postgres中,是否可以对其进行索引并提高性能?,postgresql,indexing,Postgresql,Indexing,我收到了大量关于越来越多的用户的数据,这些用户试图完成一项体力壮举,但随后失去兴趣而离开。每个用户都有一个唯一的id。每个尝试都有一个唯一的id。数据以一个表的形式流向我,该表将用户与尝试(rel_user_尝试)关联起来。请注意,尝试是成批到达的,但并不总是按时间顺序 rel_user_attempts ----------------- id (pk) archived userid attemptid (unique) 1 false 152

我收到了大量关于越来越多的用户的数据,这些用户试图完成一项体力壮举,但随后失去兴趣而离开。每个用户都有一个唯一的id。每个尝试都有一个唯一的id。数据以一个表的形式流向我,该表将用户与尝试(rel_user_尝试)关联起来。请注意,尝试是成批到达的,但并不总是按时间顺序

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_尝试,其中userid=19,archived=false


在使用非唯一列(userid)存储大量值的postgres中,是否可以对其进行索引并提高性能?

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

CREATE INDEX idx ON rel_user_attempts (userid, archived);

至少从示例数据来看,
userid
列的基数似乎不高,但至少有点高。假设存档的
是一个布尔列,假设真/假值以相同的概率出现,则此列的基数较低。但是,我们仍然可以将其包含在上面的索引中,以完全覆盖查询的
WHERE
子句。考虑添加上面的索引,然后检查执行计划。

这可能更好地在姐妹站点存档的布尔中被请求实际上是作弊或者由于记录人员的天气或人的不准确或其他未预料到的影响而无效的尝试。理想情况下,存档的真实值应较低,但实际值可能为30%