sql - 在 Web 应用程序中提供快速 `select count(*)` 功能

标签 sql postgresql heroku berkeley-db

我正在重新实现一个应用程序以支持全国工程竞赛,将其从本地服务器移至云端。

为了告诉团队他们此刻的位置,查询的形式为

select 1 + count(*) from team where where score < ?

团队得分动态变化。可能有多达 200 万个团队,我需要每秒处理至少 10 个这样的查询。

原始版本通过使用单独的 Berkeley 团队/分数记录数据库获得了所需的性能(实际上它已经用 1999 年的硬件实现了)。 Berkeley DB 中有一个“记录号”功能,它提供了完全正确的功能,而且速度非常快。

Heroku 显然无法支持 Berkeley DB。 PostgreSQL,他们的标准数据库,通过全表或索引扫描来执行 select count(*),这太慢了。

关于如何进行的任何想法?我不喜欢 Heroku,但必须转向某种云解决方案。

最佳答案

使用redis将您的团队数据存储在一个有序集合中。然后 ZRANK函数将返回您需要的计数。 Redis 总体上非常快,ZRANK 函数的预期复杂度为 O(log N)。它是通过跳跃列表实现的。

关于sql - 在 Web 应用程序中提供快速 `select count(*)` 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769823/

相关文章:

sql - Postgres FIFO查询计算利润率

ruby-on-rails - 生成 SSL 私钥时出错 - Heroku - OpenSSL - Rails

heroku - 在Heroku中使用Bonsai.io指向同义词文件路径

python-3.x - heroku python datetime不包括fromisoformat

mysql - 从 2 行替换

python - 如何在 Django 中按 id 和 Order By 计数分组

sql - Oracle 自联接并与另一个表链接

sql - 在 Oracle SQL 中排除/忽略周末

postgresql - SOAP "error fetching http headers": how do I do suspected solution of disabling keep-alive?

arrays - 如何使用 postgres 获取不同的数组元素?