java处理亿级数据问题

心事讲给大风听 发布于 09/21 14:12
阅读 2K+
收藏 1

必威体育app手机版需求:从表a查出数据存入表b里

目前表a有4亿左右数据量,关键字段是手机号和c字段,手机号有重复,然后把从表a里查出的每一条数跟表b里的手机号字段进行比较,如果手机号重复则更新c字段,如果没有就新增到表b里

必威体育app手机版目前做法: 写了一个while循环,每一次循环从表a里取3000条数据,在把3000条数据进行循环,拿到每一条数据查表b进行依次比较新增或修改

测了一下这种方式处理数据效率太低了,for循环每循环一次就需要查库和改库,有没有一种更好的方式来解决这个问题?请指教

以下是问题补充:

@Kendlowski:多线程,多机器,别一次查一条 (09/22 09:49)
@亭舸翁:弄个redis,4亿条手机号占不了多少空间。都算完了再batch insert到库里 (09/22 12:27)
加载中
0
sprouting
sprouting

上es,这么大的数据量,查询全部走es,然后根据主键进行更新操作

0
逆风扬
逆风扬

增加一个时间戳字段,每次增量处理,直接使用数据库技术对比a表和b表:先做更新操作,然后在做插入操作。

0
木九天
木九天

必威体育app手机版手机号做唯一键,直接把A表数据新增或更新到B表

0
快乐and小猪
快乐and小猪

根据最大id做区间分隔[1,1亿] 可以按1w步长切分为 1w份任务,然后多机器多线程取任务,去做任务

0
星爷
星爷

必威体育app手机版根据手机号批量查询a  b 中的手机号 和 c字段  然后程序直接对比 是新增还是 更新。批量操作回去就行。

0
wei2011
wei2011

用replace into更新插入,多线程,分批提交,比如每个线程执行3000条再提交一次事务

0
fat-rabbit
fat-rabbit

必威体育app手机版数据库的问题还是在数据库层面想办法

1,如果数据库是Oracle,以上以为可以用 merge into做

2,如果数据库是Mysql,需要拆分两步

必威体育app手机版- update set A.c = XXX A, (select phone from B) where A.phone = B.phone

- into B select XXX from A where A.phone not in (XXX)

0
z
zb79463626

1. 全部加载到Set或者Map里面,然后进行对比(几千万数据非常非常快,具体时间忘了,应该在几秒之内)

必威体育app手机版2. 差异数据生成批量更新SQL

必威体育app手机版3. 批量执行SQL,批量大小看数据库性能,可以先试试5000条

必威体育app手机版这样性能瓶颈完全在3,如果是mysql的话,可以改刷盘参数显著提升性能。

0
梦里蓝天
梦里蓝天

必威体育app手机版我的想法,1使用left join 联合查出 a b表的数据,这样手机号没有在b的,b表的字段没有值,可以使用a.id > * and a.id < *;多查点。

必威体育app手机版2.循环查出来的数据判断是不是b表字段有值,以手机号为key放入set,有值得1,没有的0,并且过滤了重复的手机号,如果平均2个是一样的这样直接4亿变2亿了。

3.根据set插入数据或者修改数据

0
0
0号开发者

第一步,A表数据根据手机号自去重,利用Redis可以实现;第二步,若B表数据是规范的,且数据远小于B表,则可以遍历B的数据,查询Redis进行二次去重并更新;最后批量插入剩余的A表数据;如果B表数据比A多或者差不多,第二步可以把B表数据也写入Redis进行去重,得到一个大的数据集合,最后备份B表,Truncate后进行全量写入。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部