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

现在有需求如下:
需要通过 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:

悲观者永远正确,乐观者永远前行。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

2年前 评论
讨论数量: 15

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

2年前 评论

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

2年前 评论

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

2年前 评论

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

2年前 评论

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

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

2年前 评论
Imuyu 2年前
playmaker 2年前

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

2年前 评论
Imuyu 2年前
playmaker 2年前
LiamHao 2年前

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

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

非常感谢大家的回复~ :+1:

2年前 评论

统计数据变化方案:

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

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

2年前 评论

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

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

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

2年前 评论

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

2年前 评论

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

2年前 评论

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

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!