单表有 100 万数据,我要从中取出,然后 update 状态为‘已取出’,然后发送到指定的 http 接口,发送成功的话再将状态改为‘已发送’,请问各位大神如何设计才能时间最短。
1
sujin190 Mar 18, 2019
如果结果只是需要统计展示的话,最快的应该是再加两个表,一个存是否出去,一个存是否发送,把更新操作变成批量写是最快的了吧,到时再联表查一下就出来了
|
2
codeismylife OP @sujin190 我也想过,业务上不允许,所以只能从多线程之类的角度来考虑了。
|
3
maxiaofeng Mar 18, 2019
@sujin190 咋不直接加两个字段
|
4
sujin190 Mar 18, 2019
@maxiaofeng #3 加两个字段不还是更新操作么?这种情况就要把更新操作变成批量写才快啊
|
5
sujin190 Mar 18, 2019
@codeismylife 那要不就新写到新表里,全部做完之后统一合并之后批量更新,如果字段值占用字节数不变,批量更新估计也不慢
|
6
FrailLove Mar 18, 2019
我怎么感觉 “从数据库取出 100 万数据并发送到指定接口” 是个伪需求
|
7
mortonnex Mar 18, 2019
瓶颈全在 IO 上:
1.优化数据库连接和 sql 2.网络用 netty,利用零拷贝 3.多线程,每个线程负责一部分数据 4.批量更新,因为 update 会锁表 其实这里使用多线程意义不大,因为单线程也可以打满网络 IO |
8
ty89 Mar 18, 2019
典型的”生产者-消费者”模型
1,一次取出一批数据,把待处理数据放进队列中。如果数据已经在队列里,那么状态就是‘已取出’,这样避免了 update 操作 2,足够多的 worker 3,取出数据之后,放进 redis 里 |