登录后如何显示每个用户的总数 - 拥有25,000个用户的数据库 - 数百万行?

时间:2011-10-28 17:31:14

标签: mysql database

我正在处理大约25,000名用户的数据库,这些用户平均每天添加约6行(员工保留工作订单的日志)。基本上,数据库不确定地增长并包含数百万行(在这25,000个用户之间划分)。

用户登录后,我希望系统显示一些总计,例如在整个工作生涯中用卡车编号xyz驱动的里程,在订单项xyz上工作的总时间等等。基本上,每次用户登录时,都需要立即显示这些总数。此外,一旦用户为工单添加行,总计需要立即反映此更改。

是否建议为每个用户构建一个总计表,并使用每个条目进行更新。或者我应该只查询数据库并让它在每次用户登录时动态计算总数(无总表)。如果用户每秒登录一次并且数据库需要根据数百万行吐出总数,那么会产生瓶颈吗?谷歌如何做到这一点? :)

感谢。

4 个答案:

答案 0 :(得分:5)

您可能会发现一个简单的查询足够快,具有适当的索引(例如索引user_id)。这应该减少需要扫描的行数。

但如果这还不够快,您可以在一夜之间计算所有用户的结果,并将此结果缓存到另一个表中。然后,您可以执行以下操作:

  • 直接从缓存表中获取最后一次缓存更新的总数。
  • 从主表中获取自上次缓存更新以来的总数。
  • 添加这两个数字以获得总数。

另一种选择是使用triggers来保持预先计算的结果准确,即使插入,更新或删除行也是如此。

答案 1 :(得分:0)

我认为你可以创建一个汇总表,而不是加入百万行表。 例如,它可以在晚上运行一个cron。

答案 2 :(得分:0)

如果你想要“即时”,那么就不要把总数保留在表中,因为每次基础数据发生变化时你都要担心通过某个过程更新它们。

只要你的索引很好,并且你有一些不错的硬件,那么每次查询这些总数都没有问题。

就Google而言,他们拥有大量的服务器,基本上将整个索引保存在RAM中,并且具有几乎无限的计算能力。

答案 3 :(得分:0)

如果您在索引表后实际发现搜索/更新速度太慢,请考虑将日志表拆分为多个。根据您的设计和对加速的兴趣,它可以通过多种方式拼接:

log_truck_miles (driver, truck_id, miles)
log_work_times (worker, job_id, minutes) ...etc.

您可以拆分的另一种方法是量化工作人员ID - user_id低于5,000的日志条目进入表log_0_5。 5,000到10,000转到log_5_10