postgresql - 在具有存储大量值的非唯一列的 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 中,是否可以对其进行索引并提高性能?
解决方案
使用任何索引的好处,或者 Postgres 是否可能选择使用特定索引,取决于几件事,其中包括基础数据的基数。当用于往往具有唯一或相对唯一值的列时,索引最有帮助。您可能会发现以下索引在这里很有帮助:
CREATE INDEX idx ON rel_user_attempts (userid, archived);
至少从您的样本数据来看,该列上的基数userid
似乎不高,但至少有点高。鉴于这archived
是一个布尔列,假设真/假值以相等的概率出现,则该列的基数会很低。但是,我们仍然可以将它包含在上述索引中,以完全覆盖WHERE
您查询的子句。考虑添加上述索引,然后检查执行计划。
推荐阅读
- c++ - 使用 C++ 的 Redis 5.0 集群的选项
- jupyter-notebook - Jupyter Notebook 不加载笔记本
- javascript - 从 document.createElement 中删除包装 div
- android - 我的 Android 应用程序中发生了什么导致其丢失数据?
- autofac - Autofac 和 NLog 的日志记录模块如何工作?
- python-3.x - 如何无限点击显示更多按钮以生成完整页面然后收集数据链接?
- react-native - 动画和 flex 布局之间的空间
- python - 从数组Python中添加/删除对象
- android - 谁在改造中打开适配器的链接?
- wpf - 从窗口中的用户控件中的WPF调用方法