使用mysql php进行用户带宽配额管理

时间:2014-07-17 00:29:50

标签: php mysql time-series user-management quota

我在mysql中有一个包含50k +条目的大型用户表。 这些用户对我们网站中存储文件的下载限额有限。 目前,配额通过重置单独的流量来重置流量计数,每24小时重置一次' table(每行有一个userid和一个trafficused字段条目) 这使得两个表每个有50k个条目(代表50k用户) 到目前为止,这个系统工作正常,但由于每天重置配额,我无法保留用户的带宽使用历史记录,我必须清除流量表。 我使用php在每次下载完成时更新传输的带宽。 我需要能够尽可能有效地限制每天和/或每月的配额,而不会弄乱mysql表。 还有另一个复杂因素,我为不同的文件类型分配了用户配额。例如.iso文件没有配额,.mp4文件每天限制5GB。和.rar文件每天限制10GB。 每天最大用户配额为20GB。

我知道这听起来很混乱。如果需要,我可以在这里发布表结构。 如果可以,请尽力提供帮助。 感谢

1 个答案:

答案 0 :(得分:1)

50k行是一个中等大小的表,不是很大。不要害怕这个大小,只需正确索引。

尝试在您的traffics表格中添加DATE列。每天运行一次MySQL事件来执行此查询:

DELETE FROM traffics WHERE trafficdate < CURDATE() - INTERVAL 30 DAY

这将清除旧的流量记录。

当你需要知道今天的用法时

SELECT trafficused FROM traffics WHERE userid = whatever
                                   AND traFficdate = CURDATE()

同样,当你需要30天时,值得交通,做

  SELECT SUM(trafficused) FROM traffics WHERE userid = whatever

要存储流量交易,请执行此操作

  INSERT INTO traffics (userid, trafficdate, trafficused)
                VALUES (whatever, CURDATE(), filesize)
  ON DUPLICATE KEY UPDATE trafficused=trafficused+filesize

确保您的traffics表格具有复合主键(userid,trafficdate)

同时创建复合索引(userid,trafficdate,traffics)以加快查询速度。

这种方法,使用ON DUPLICATE KEY,意味着您不必每天为每个用户排一行。

处理每个文件类型的单独带宽是添加文件类型列并将其放入索引和查询中的问题。