如何有效地计算用户在一个月内执行的操作数?

Posted

技术标签:

【中文标题】如何有效地计算用户在一个月内执行的操作数?【英文标题】:How can I efficiently calculate the number of actions a user has made in a month? 【发布时间】:2012-09-23 15:49:40 【问题描述】:

我有一个包含两个表的数据库:一个表列出了多个用户,另一个表列出了这些用户执行的每个操作、执行操作的用户的 ID 以及操作的日期。

我正在尝试计算每个用户每月执行的操作数。我不确定如何有效地做到这一点:有人有什么建议吗?

【问题讨论】:

【参考方案1】:

使用MONTH()DATE 中提取月份,然后使用GROUP BY 提取MONTHUSER_ID

SELECT u.user_id, MONTH(a.date), COUNT(*) number_of_actions
FROM users u INNER JOIN actions a ON (u.user_id = a.user_id)
GROUP BY u.user_id, MONTH(a.date)

另外,如果用户操作跨越多年,并且您希望 2011 年 1 月2012 年 1 月 有不同的计数,请按 both 分组> 改为YEARMONTH

SELECT u.user_id, YEAR(a.date), MONTH(a.date), COUNT(*) number_of_actions
FROM users u INNER JOIN actions a ON (u.user_id = a.user_id)
GROUP BY u.user_id, YEAR(a.date), MONTH(a.date)

【讨论】:

如果我有很多用户或操作,该查询是否会效率低下?感谢您的回答:) @Christofian:这取决于。我们在谈论多少用户和操作?有一些方法可以优化它,不是查询本身,而是你的数据库。例如,向actions 表中的user_id 字段添加索引。这将优化两个表之间的连接。要优化GROUP BY,您可以在MONTH(date) 上使用函数索引,但我认为mysql 不支持这些。另一种方法是对 actions 表进行非规范化并向其添加 MONTH 列,您可以对其进行索引。【参考方案2】:

如果@Joao Silva 的回答太慢,您可以使用触发器或存储过程进行更新来维护计数,因为操作发生在单独表中的单独表中。如果基于磁盘的表太慢,您可以使用内存表并在服务器重新启动时重建它,或者使用 Redis 实例来保留此信息。

【讨论】:

以上是关于如何有效地计算用户在一个月内执行的操作数?的主要内容,如果未能解决你的问题,请参考以下文章

操作系统

如何确保用户无法在SAME计算机上执行某些操作[重复]

如何有效地将用户添加到 GitLab 中的所有项目(以编程方式或其他方式)

操作系统是什么

TaskCompletionSource的使用场景

操作系统引论