请问大家都是怎样计算和统计每日数据变化的?

现在有需求如下:
需要通过 API 接口返回 区间日期 的每日新用户注册数据给前端,来做数据变化图标,数据格式要求如下:

[
    ...
    // 日期 => 当日注册总人数
    '20210501' => 30,
    '20210502' => 33,
    '20210503' => 10,
    '20210504' => 0,
    '20210505' => 36,
    ...
]

假如 日期区间 是 7 日内,那么数组中就有 7 条记录

mysql 数据表如下:

id name phone created_at updated_at
1 乔峰 5111 2021-05-01 12:21:33 2021-05-03 12:21:33
2 段誉 1112 2021-05-03 21:31:00 2021-05-07 12:21:33
3 虚竹 1234 2021-05-03 21:31:00 2021-05-07 12:21:33

第一次做这种需求,我第一时间能想到的处理方法只能是循环单独查询和统计区间内的每日新增的所有用户,但是如果区间是一年的话,这样做肯定会把数据库拖死。

还有一种方法是,查询区间内的所有用户,然后再使用循环来单独统计每日的所有用户,这样感觉好一些,但是感觉还是有点蠢。

不知道大家都是怎么做这种需求的呢?希望大家不吝赐教,非常感谢!

在我写 乔峰,段誉,虚竹名字的时候,耳机里随机播放的歌曲突然切到了《难念的经》好巧啊~:blush:

悲观者永远正确,乐观者永远前行。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

其实为了这点功能上 redis 太大材小用,如果原先就用到了还好说,本质上如果不是很精确的统计,每次统计后存入数据库,下次直接读取即可,因为当天以前的数据不大可能会变化,如果进一步精确,可以增加时间限制,每个统计数据存活指定时间,过期后重新统计存储!

3年前 评论
讨论数量: 15

首先想用 Redis 缓存,每天凌晨跑定时任务,将 sql 查询的数据放入 Redis,取数据就从 Redis 取。顺便打个广告,查询统计数量

3年前 评论

不嫌麻烦 冗余张表,俩字段一个日期一个值 今天同步昨天的数据到这张表上

3年前 评论

其实为了这点功能上 redis 太大材小用,如果原先就用到了还好说,本质上如果不是很精确的统计,每次统计后存入数据库,下次直接读取即可,因为当天以前的数据不大可能会变化,如果进一步精确,可以增加时间限制,每个统计数据存活指定时间,过期后重新统计存储!

3年前 评论

这种不会改变的历史数据,可以定时任务来处理,写入另一个统计数据表中……

3年前 评论

这个肯定要按日,然后保存起来,跟现实生活中一样。一年 365 天,365 条数据。

注册的时候通过事件保存。

3年前 评论
Imuyu 3年前
playmaker 3年前

@Imuyu 每日凌晨 12 点统计一次当日所有新注册的用户,然后存入统计表,这样开销是不是小一些?

3年前 评论
Imuyu 3年前
playmaker 3年前
LiamHao 3年前

短期来看,你这个需求数据量就 7 天,很少,用 mysql 处理一下就可以了,我一般来说会直接存储一个 date 字段 记录 0 点,也可以算一下。用户百万以内直接 mysql 问题应该也不大,毕竟你这需求不复杂。

SELECT
    COUNT(*),
    DATE_FORMAT( created_at, '%Y%m%d' ) AS `date` 
FROM
    user 
WHERE 七天内
GROUP BY
    date
3年前 评论

非常感谢大家的回复~:thumbsup:

3年前 评论

统计数据变化方案:

  • 单独建立一张数据变化统计表。表结构包含自增 ID、统计类别(如用户新增数据、评论新增数据、资讯新增数据)、统计类型(如每日、每 7 日、每周、每月、每年等)、统计数量、记录生成日期或时间等参数。
  • 编写定时任务程序进行数据清洗,清洗程序要清洗出对应的你需要的统计数据。

有了数据变化统计表,不管前端想要什么样式的统计数据,你都能随意的开发对应接口进行提供了。

3年前 评论

借个楼问个问题,如果需要按年月或星期来做统计,如果想要日期是连续的,最好应该怎么处理呢,之前看到有人是再加一个日历表做 join :flushed:

3年前 评论
WadeYu 3年前
LiamHao 3年前
pzwwzp (作者) 3年前
白小二 3年前

我之前写的 就是 单独一个数据表 事件 increment +1 ,

3年前 评论

看你数据量来指定方案吧,数据量不多的情况下肯定使直接一次查询所有的数据回来,然后代码处理。数据量多的话可以建一个统计表,每天凌晨跑个同步统计当天的数据

3年前 评论

一般如果表不超过 500w
都是直接查的更快一点,逻辑做起来也简单
超过的话就另外查数据转存

3年前 评论

由于之前的注册用户数不会再改变,把昨天及以前的用户注册数据都保持到一张表(id,register_date,num)里面,当天的实时统计,之前的就查统计表就可以,再写一个定时任务在凌晨的时候,把当前的注册人统计记录到统计表

3年前 评论