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

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

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