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

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

  •  
  •   Devin · 2020-12-11 08:20:08 +08:00 via Android · 5888 次点击
    这是一个创建于 1429 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 50 万笔新数据里可能有重复
    2. 数据库原有记录 1000 万笔,新数据可能与原有记录重复

    不插入(跳过)以上出现重复的新数据,怎么做最有效率?
    第 1 条附言  ·  2020-12-11 13:48:48 +08:00
    每天产生,表格有接近 50 个字段,只能根据 10 个字段判断出记录的唯一性
    27 条回复    2020-12-12 20:08:33 +08:00
    optional
        1
    optional  
       2020-12-11 08:22:31 +08:00 via Android
    加约束
    进临时表
    insert on conflict
    levelworm
        2
    levelworm  
       2020-12-11 08:30:43 +08:00
    先全部导入到临时表,然后 merge 的时候去掉重复的,我是 Vertica 。
    dreasky
        3
    dreasky  
       2020-12-11 08:35:25 +08:00
    加 unique 索引,insert ignore ,性能就不知道了
    jorneyr
        4
    jorneyr  
       2020-12-11 08:55:48 +08:00   ❤️ 3
    insert ignore,开启事务,每次 5000 笔提交,几分钟就跑完了
    byte10
        5
    byte10  
       2020-12-11 09:26:42 +08:00
    随便 搞下就行了。500W 都不是问题
    taozywu
        6
    taozywu  
       2020-12-11 09:29:32 +08:00
    1 )使用 sqlyog,navcat 很 easy 的
    2 )或者在数据表结构增加 unique 索引
    3 )。。。
    egoistttt
        7
    egoistttt  
       2020-12-11 09:45:11 +08:00
    replace into
    LuciferGo
        8
    LuciferGo  
       2020-12-11 13:25:37 +08:00   ❤️ 1
    oracle 的话目标表加个唯一索引,sqlldr 后,重复数据会进入到 bad 文件,也可以用无唯一性中间表导入后去重加载到结果表,MySQL 是 insert 后加个 ignore,就可以了
    AmosAlbert
        9
    AmosAlbert  
       2020-12-11 13:31:52 +08:00 via Android
    先进 Redis
    qiayue
        10
    qiayue  
       2020-12-11 13:39:03 +08:00
    总共只有 50 万笔需要插入,还是每隔一段时间都会产生 50 万笔?
    两种情况有两种完全不同的处理方式。
    如果是后者,间隔时间是多久?每秒还是每分钟还是每小时?
    场景不介绍清楚,没办法给出最合适的解决方案。
    Devin
        11
    Devin  
    OP
       2020-12-11 13:48:34 +08:00 via Android
    @qiayue 每天产生,表格有接近 50 个字段,只能根据 10 个字段判断出记录的唯一性
    SlipStupig
        12
    SlipStupig  
       2020-12-11 13:50:50 +08:00
    @Devin 将这十个字段生成一个 SHA256 的 hash,作为索引,很容易判断的啊
    qiayue
        13
    qiayue  
       2020-12-11 14:15:15 +08:00
    是的,按顺序拼接十个字段,记住中间要加入分隔符,然后算下 md5 值当做唯一键
    kaiki
        14
    kaiki  
       2020-12-11 14:22:59 +08:00
    加个索引呗
    hejw19970413
        15
    hejw19970413  
       2020-12-11 17:47:28 +08:00
    先分类 、多加个字段 。 归并排序的思想
    xmge
        16
    xmge  
       2020-12-11 19:27:49 +08:00
    replaceinto
    lithbitren
        17
    lithbitren  
       2020-12-11 19:35:00 +08:00
    拼接哈希在内存里操作就得了,1000 万也没多少的,处理完数据再用唯一索引结构
    xcstream
        18
    xcstream  
       2020-12-11 20:11:29 +08:00
    布隆过滤器
    wellsc
        19
    wellsc  
       2020-12-11 21:28:36 +08:00 via iPhone
    @xcstream 五十万就上布隆了,是不是八股文看多了
    autogen
        20
    autogen  
       2020-12-12 00:33:06 +08:00
    加 union index,直接 insert 就会跳过重复的数据
    autogen
        21
    autogen  
       2020-12-12 00:33:50 +08:00
    50 万不多不少,1 分钟应该能导完
    janus77
        22
    janus77  
       2020-12-12 01:28:26 +08:00
    50 万本身先去个重。我个人的话,先取 10 个字段里的第一个过滤遍,第二个再过滤一遍,然后剩下的 8 个字段做 hash 过滤一遍。这样做的原因是前两遍可以以最小的成本达到最大比例的过滤效果。当然这个前 n 遍可以根据你们字段复杂度来定。这整个步骤在临时表做
    然后就是 50 万里面剩下的数据,再用 10 个字段做 hash,和主表过滤。完毕
    nuistzhou
        23
    nuistzhou  
       2020-12-12 10:39:17 +08:00 via iPhone
    这数据不多,加个约束很简单,就像楼上说的,不过可能会花点时间。我之前整类似的上亿条的才叫慢...
    wangbenjun5
        24
    wangbenjun5  
       2020-12-12 11:14:28 +08:00
    建个索引就能解决的问题,如果追求性能,那就加个布隆过滤器呗
    zjttfs
        25
    zjttfs  
       2020-12-12 13:41:08 +08:00
    十个字段拼接算出 md5 , 然后 md5 也存进去,md5 字段加唯一索引.
    hubahuba
        26
    hubahuba  
       2020-12-12 14:11:22 +08:00
    @zjttfs 这是啥操作老哥 求解释
    optional
        27
    optional  
       2020-12-12 20:08:33 +08:00 via iPhone
    @zjttfs 50w 冲突概率挺大的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2851 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:22 · PVG 10:22 · LAX 18:22 · JFK 21:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.