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

今天干的蠢事

  •  
  •   dackh ·
    dackh · 2020-02-20 17:31:14 +08:00 · 2306 次点击
    这是一个创建于 1743 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天需要捞出一张表的数据( xxId ),然后插入另一张表中,数据量比较大,200W,并且 xxId 会重复,需要去重之后再插入另一张表。

    • 一开始我选择查询出所有的数据,存入 Set 中去重,此时剩余 60W,之后每次 1W 条插入表中,直接 OOM。
    • 查询的时候通过 limit 每次捞出 1W 条数据,去重插入,此时原表 xxId 重复,然后导致前后两次去重插入后 xxId 还是重复了。
    • 去重通过 distinct,每次捞出 1w 条,然后插入... 效率巨慢,相当于要进行 60 次 distinct....

    https://github.com/dackh/blog

    blog 喜欢可以 star hhh

    6 条回复    2020-02-21 16:40:52 +08:00
    mull
        1
    mull  
       2020-02-20 19:43:59 +08:00 via Android
    所以最后怎么解决的
    BBCCBB
        2
    BBCCBB  
       2020-02-20 20:02:27 +08:00
    你是来推销你的 github 的吧
    rekulas
        3
    rekulas  
       2020-02-20 22:52:43 +08:00
    直接导出 sql,选择一条数据一条语句,然后批量替换 insert into >> insert ignore into
    新表 xxid unique 导入,应该就完了,一行代码都不用写
    heart4lor
        4
    heart4lor  
       2020-02-21 12:26:56 +08:00
    最后还是通过 60 次全表 distinct 吗?有没有更优雅的办法

    3L 似乎是个办法
    dackh
        5
    dackh  
    OP
       2020-02-21 16:40:06 +08:00
    @heart4lor 是的,我就是 60 次 distict....时间比较长,还是搞完了

    我这里只查 xxId,并且是主键,我在想直接一次性把 60WxxId 捞出来分多次去 insert 也是可以的,insert ignore into 这种方法也行...之前在家里划水写的脏代码真的是...
    dackh
        6
    dackh  
    OP
       2020-02-21 16:40:52 +08:00
    @BBCCBB 喜欢可以 star 的哥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:01 · PVG 07:01 · LAX 15:01 · JFK 18:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.