需求:统计用户首次 XXX 的时间,用户表:百万数据, XXX 表:亿级数据

2019-09-30 10:24:44 +08:00
 LoremIpSum

来了几个比较不好处理的需求: 统计用户首次 XXX 的时间,XXX 代表用户行为,可以是评论,发帖,点赞等,XXX 表的数据上亿,用户表也接近百万,直接用 SQL 去查肯定不是很合适,如果要把每个用户首次 XXX 的数据拿出来的话,大概怎么样来跑数据比较合适?

3670 次点击
所在节点    程序员
24 条回复
liprais
2019-09-30 10:26:55 +08:00
为啥直接写 sql 不合适?
alamaya
2019-09-30 10:30:27 +08:00
没戏,拆表,把用户行为细分,存量数据迁移,只记录最新行为时间
LoremIpSum
2019-09-30 10:31:56 +08:00
@liprais

```
SELECT MIN(A.CreateTime) ,A.UserId
FROM XXX A
GROUP BY A.UserId
```
大概是这种 SQL,跑起来特别慢
encro
2019-09-30 10:33:49 +08:00
stat_by_day:
date,
action,
value
sadfQED2
2019-09-30 10:34:11 +08:00
分表 or 加缓存

你用 uid 分表不就完事了吗
arrow8899
2019-09-30 10:40:01 +08:00
SELECT * FROM (SELECT * FROM actives ORDER BY add_time ASC ) t1 GROUP BY t1.uid, t1.active_name;
Raymon111111
2019-09-30 10:40:25 +08:00
加上 user_id, action_type, time 的联合索引之后

直接查就行了, limit 1 很快的
misaka19000
2019-09-30 10:41:04 +08:00
每天凌晨算一次不就行了
seaguest
2019-09-30 10:41:22 +08:00
直接代码去实现吧,把用户都分页查出来,然后查每个用户的第一条,控制好并发,也很快的。
misaka19000
2019-09-30 10:41:49 +08:00
这种数据都是确定的,每天针对最新数据算一次就可以了,感觉没啥难度
ccoming
2019-09-30 10:56:12 +08:00
是“首次”,不是最新?
LoremIpSum
2019-09-30 11:12:02 +08:00
@ccoming 首次!
jieee
2019-09-30 11:12:49 +08:00
单独维护一张表
tanszhe
2019-09-30 11:15:10 +08:00
就用 3 楼的写法 ,
把首次 xxx 的数据存到时序数据库
什么都不用优化 百亿也很快
xio
2019-09-30 11:39:32 +08:00
postgres left join lateral
opengps
2019-09-30 11:40:26 +08:00
看到这类帖子我就想总结下: https://www.opengps.cn/Blog/View.aspx?id=470&from=v2ex
msg7086
2019-09-30 12:43:12 +08:00
首次多简单,直接写代码扫全表啊,数据放在 redis 之类的地方。程序每次记录扫完的数据,从头开始一页一页扫。(比如每页 10 万条记录。)扫到以后去 redis 检查是否首次,是的话写下时间,不是的话跳过。
应该很快的。
passerbytiny
2019-09-30 13:35:59 +08:00
最省心(但最废功夫)的办法是,搞数据仓库或 BI。最省功夫(但要一直重复造轮子)的方法是,写一个专门的程序,把数据从基础表抽取到中间表。最不可能的方式是,写一个超牛逼的 SQL 查出来。
Soar360
2019-09-30 15:40:18 +08:00
按行去处理咯。
vmskipper
2019-09-30 15:43:05 +08:00
这个好像微博的面试题。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/605571

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX