我正在处理大约25,000名用户的数据库,这些用户平均每天添加约6行(员工保留工作订单的日志)。基本上,数据库不确定地增长并包含数百万行(在这25,000个用户之间划分)。
用户登录后,我希望系统显示一些总计,例如在整个工作生涯中用卡车编号xyz驱动的里程,在订单项xyz上工作的总时间等等。基本上,每次用户登录时,都需要立即显示这些总数。此外,一旦用户为工单添加行,总计需要立即反映此更改。
是否建议为每个用户构建一个总计表,并使用每个条目进行更新。或者我应该只查询数据库并让它在每次用户登录时动态计算总数(无总表)。如果用户每秒登录一次并且数据库需要根据数百万行吐出总数,那么会产生瓶颈吗?谷歌如何做到这一点? :)
感谢。
答案 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