• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Devin
V2EX  ›  程序员

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

  •  
  •   Devin · Dec 11, 2020 via Android · 6717 views
    This topic created in 1997 days ago, the information mentioned may be changed or developed.
    1. 50 万笔新数据里可能有重复
    2. 数据库原有记录 1000 万笔,新数据可能与原有记录重复

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