如何有效地计算用户在一个月内执行的操作数?
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
提取MONTH
和USER_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 分组> 改为YEAR
和MONTH
:
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 实例来保留此信息。
【讨论】:
以上是关于如何有效地计算用户在一个月内执行的操作数?的主要内容,如果未能解决你的问题,请参考以下文章