50 万笔新数据插入到数据库,如何避免重复?

2020-12-11 08:20:08 +08:00
 Devin
1. 50 万笔新数据里可能有重复
2. 数据库原有记录 1000 万笔,新数据可能与原有记录重复

不插入(跳过)以上出现重复的新数据,怎么做最有效率?
5901 次点击
所在节点    程序员
27 条回复
optional
2020-12-11 08:22:31 +08:00
加约束
进临时表
insert on conflict
levelworm
2020-12-11 08:30:43 +08:00
先全部导入到临时表,然后 merge 的时候去掉重复的,我是 Vertica 。
dreasky
2020-12-11 08:35:25 +08:00
加 unique 索引,insert ignore ,性能就不知道了
jorneyr
2020-12-11 08:55:48 +08:00
insert ignore,开启事务,每次 5000 笔提交,几分钟就跑完了
byte10
2020-12-11 09:26:42 +08:00
随便 搞下就行了。500W 都不是问题
taozywu
2020-12-11 09:29:32 +08:00
1 )使用 sqlyog,navcat 很 easy 的
2 )或者在数据表结构增加 unique 索引
3 )。。。
egoistttt
2020-12-11 09:45:11 +08:00
replace into
LuciferGo
2020-12-11 13:25:37 +08:00
oracle 的话目标表加个唯一索引,sqlldr 后,重复数据会进入到 bad 文件,也可以用无唯一性中间表导入后去重加载到结果表,MySQL 是 insert 后加个 ignore,就可以了
AmosAlbert
2020-12-11 13:31:52 +08:00
先进 Redis
qiayue
2020-12-11 13:39:03 +08:00
总共只有 50 万笔需要插入,还是每隔一段时间都会产生 50 万笔?
两种情况有两种完全不同的处理方式。
如果是后者,间隔时间是多久?每秒还是每分钟还是每小时?
场景不介绍清楚,没办法给出最合适的解决方案。
Devin
2020-12-11 13:48:34 +08:00
@qiayue 每天产生,表格有接近 50 个字段,只能根据 10 个字段判断出记录的唯一性
SlipStupig
2020-12-11 13:50:50 +08:00
@Devin 将这十个字段生成一个 SHA256 的 hash,作为索引,很容易判断的啊
qiayue
2020-12-11 14:15:15 +08:00
是的,按顺序拼接十个字段,记住中间要加入分隔符,然后算下 md5 值当做唯一键
kaiki
2020-12-11 14:22:59 +08:00
加个索引呗
hejw19970413
2020-12-11 17:47:28 +08:00
先分类 、多加个字段 。 归并排序的思想
xmge
2020-12-11 19:27:49 +08:00
replaceinto
lithbitren
2020-12-11 19:35:00 +08:00
拼接哈希在内存里操作就得了,1000 万也没多少的,处理完数据再用唯一索引结构
xcstream
2020-12-11 20:11:29 +08:00
布隆过滤器
wellsc
2020-12-11 21:28:36 +08:00
@xcstream 五十万就上布隆了,是不是八股文看多了
autogen
2020-12-12 00:33:06 +08:00
加 union index,直接 insert 就会跳过重复的数据

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

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

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

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

© 2021 V2EX