Explanation:
>我有一个脚本,显示每个用户的总学分(声誉),它在数据库中有一个历史记录表,用于所有学生的学分
以下是我的历史数据库表的示例:
+----------------------------------------------+ | DATE ID USERNAME CREDITS | +----------------------------------------------+ | ... 1 X 12 | | ... 2 E 2 | | ... 3 X 1 | | ... 4 X -7 | | ... 5 O 4 | +----------------------------------------------+
>我的脚本使用SELECT SUM FROM TABLE WHERE username =’X’并回显它,所以在这种情况下,对于用户X(12 1 – 7),它回应6
Questions:
>我想知道的不是这个(SELECT SUM的所有历史,显示一个用户信用INSTEAD有一个不同的表的总用户数)如果历史表是如此巨大的问题,会出现问题? (让我们说几年后的100,000,000条记录)
这是大多数专业程序员做的吗? (如果不是,什么)
>如果用户想要查看信用记录,那么如果用户希望在* SELECT * ing或否(为了表现)时限制LIMIT 100记录,那么该历史记录部分如何?
这是否应该在每个页面上刷新或每页更改?
(如果1000个用户在线,并且每次刷新应用此SELECT查询都不会使服务器减慢)
EDIT After an answer:
但是,如果我们必须在不同的表中保持总额并自动更新它们,则有两个问题:
>如果我们完全在用户收到一些信用时做到这一点,用户是不是可以在完全相同的时间收到两个不同的信用(这是可能的),而且我们无法将自动增量放在总计表中(因为每个用户只有1条记录),我们可能会错过1个信用额,或者如果有这个问题的解决方案,我不知道
>如果我们将Cron-Job设置为频繁执行,那么在cron作业刷新总计表之前,用户积分不是最新的
If we do it exactly when user have received some credits that is possible user have received two different credits at exactly the same time (very possible),and as we can’t put Auto Increment in Totals table (because each user only have 1 record) we might miss 1 credit and don’t add it to totals table,Or if there is a solution for this problem,i am not aware of that,i only now we should use AI in these situations
我们不会错过.检查以下sql语句:
INSERT INTO history SET username = 'X',credits = 2; UPDATE users SET credits_sum = (SELECT SUM(credits) FROM `history` WHERE username = 'X') WHERE username = 'X';
即使有两个事件添加信用的情况被触发,我们的credit_sum将是最新的,因为它从数据库中存储的数据更新(不在应用程序中 – 在这种情况下,有时可能会有一些差异).