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