首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

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

  •  
  •   LoremIpSum · 75 天前 · 2116 次点击
    这是一个创建于 75 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    24 回复  |  直到 2019-09-30 22:14:20 +08:00
        1
    liprais   75 天前
    为啥直接写 sql 不合适?
        2
    alamaya   75 天前
    没戏,拆表,把用户行为细分,存量数据迁移,只记录最新行为时间
        3
    LoremIpSum   75 天前
    @liprais

    ```
    SELECT MIN(A.CreateTime) ,A.UserId
    FROM XXX A
    GROUP BY A.UserId
    ```
    大概是这种 SQL,跑起来特别慢
        4
    encro   75 天前
    stat_by_day:
    date,
    action,
    value
        5
    sadfQED2   75 天前
    分表 or 加缓存

    你用 uid 分表不就完事了吗
        6
    arrow8899   75 天前
    SELECT * FROM (SELECT * FROM actives ORDER BY add_time ASC ) t1 GROUP BY t1.uid, t1.active_name;
        7
    Raymon111111   75 天前
    加上 user_id, action_type, time 的联合索引之后

    直接查就行了, limit 1 很快的
        8
    misaka19000   75 天前
    每天凌晨算一次不就行了
        9
    seaguest   75 天前
    直接代码去实现吧,把用户都分页查出来,然后查每个用户的第一条,控制好并发,也很快的。
        10
    misaka19000   75 天前
    这种数据都是确定的,每天针对最新数据算一次就可以了,感觉没啥难度
        11
    ccoming   75 天前
    是“首次”,不是最新?
        12
    LoremIpSum   75 天前
    @ccoming 首次!
        13
    jieee   75 天前
    单独维护一张表
        14
    tanszhe   75 天前
    就用 3 楼的写法 ,
    把首次 xxx 的数据存到时序数据库
    什么都不用优化 百亿也很快
        15
    xio   75 天前
    postgres left join lateral
        16
    opengps   75 天前
    看到这类帖子我就想总结下: https://www.opengps.cn/Blog/View.aspx?id=470&from=v2ex
        17
    msg7086   75 天前
    首次多简单,直接写代码扫全表啊,数据放在 redis 之类的地方。程序每次记录扫完的数据,从头开始一页一页扫。(比如每页 10 万条记录。)扫到以后去 redis 检查是否首次,是的话写下时间,不是的话跳过。
    应该很快的。
        18
    passerbytiny   75 天前
    最省心(但最废功夫)的办法是,搞数据仓库或 BI。最省功夫(但要一直重复造轮子)的方法是,写一个专门的程序,把数据从基础表抽取到中间表。最不可能的方式是,写一个超牛逼的 SQL 查出来。
        19
    Soar360   75 天前
    按行去处理咯。
        20
    vmskipper   75 天前
    这个好像微博的面试题。。。。
        21
    dog82   75 天前
    这种需求不难,把“首次 xxx”记录单独记录一张表就行
        22
    veike   75 天前 via Android
    注册之后首次吗?接近百万用户也不多啊,加个用户附表
        23
    gamexg   75 天前
    联合索引,
    查询没什么问题,就是如果各种索引太多会影响插入速度。
        24
    pinews   75 天前
    16M 内存的服务器和 16G 的服务器速度的确不一样,上云数据库试试,没有不合适。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1476 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    ♥ Do have faith in what you're doing.