V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
codeismylife
V2EX  ›  问与答

挑战自我:从数据库取出 100 万数据并发送到指定接口,如何设计才能时间最短。

  •  
  •   codeismylife · 2019-03-18 14:33:05 +08:00 · 1437 次点击
    这是一个创建于 2107 天前的主题,其中的信息可能已经有所发展或是发生改变。
    单表有 100 万数据,我要从中取出,然后 update 状态为‘已取出’,然后发送到指定的 http 接口,发送成功的话再将状态改为‘已发送’,请问各位大神如何设计才能时间最短。
    8 条回复    2019-03-18 17:09:01 +08:00
    sujin190
        1
    sujin190  
       2019-03-18 14:39:31 +08:00
    如果结果只是需要统计展示的话,最快的应该是再加两个表,一个存是否出去,一个存是否发送,把更新操作变成批量写是最快的了吧,到时再联表查一下就出来了
    codeismylife
        2
    codeismylife  
    OP
       2019-03-18 14:42:28 +08:00
    @sujin190 我也想过,业务上不允许,所以只能从多线程之类的角度来考虑了。
    maxiaofeng
        3
    maxiaofeng  
       2019-03-18 14:48:56 +08:00
    @sujin190 咋不直接加两个字段
    sujin190
        4
    sujin190  
       2019-03-18 16:31:22 +08:00
    @maxiaofeng #3 加两个字段不还是更新操作么?这种情况就要把更新操作变成批量写才快啊
    sujin190
        5
    sujin190  
       2019-03-18 16:32:44 +08:00
    @codeismylife 那要不就新写到新表里,全部做完之后统一合并之后批量更新,如果字段值占用字节数不变,批量更新估计也不慢
    FrailLove
        6
    FrailLove  
       2019-03-18 16:34:55 +08:00
    我怎么感觉 “从数据库取出 100 万数据并发送到指定接口” 是个伪需求
    mortonnex
        7
    mortonnex  
       2019-03-18 16:46:10 +08:00
    瓶颈全在 IO 上:
    1.优化数据库连接和 sql
    2.网络用 netty,利用零拷贝
    3.多线程,每个线程负责一部分数据
    4.批量更新,因为 update 会锁表

    其实这里使用多线程意义不大,因为单线程也可以打满网络 IO
    ty89
        8
    ty89  
       2019-03-18 17:09:01 +08:00
    典型的”生产者-消费者”模型

    1,一次取出一批数据,把待处理数据放进队列中。如果数据已经在队列里,那么状态就是‘已取出’,这样避免了 update 操作

    2,足够多的 worker
    3,取出数据之后,放进 redis 里
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5765 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:33 · PVG 14:33 · LAX 22:33 · JFK 01:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.