V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
sw1962
V2EX  ›  MySQL

数据是先建立索引再去重好呢,还是先去重

  •  
  •   sw1962 · 2016-09-28 21:03:35 +08:00 · 3313 次点击
    这是一个创建于 2984 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前建立了一个大概几千万的数据,都放在了一个表里,然后进行去重复, 2 天了还没完成。
    主要考虑到的是一个表,批量查询数据比较方便



    考虑到这,是否有快速去重的方法。
    代码是:

    DELETE p1 from `1_2016926` p1, `1_2016926` p2 WHERE p1.`name` = p2.`name` AND p1.age = p2.age AND p1.id < p2.id;
    9 条回复    2016-09-29 08:53:31 +08:00
    yidinghe
        1
    yidinghe  
       2016-09-28 21:05:02 +08:00 via Android
    唯一索引必须先去重
    sw1962
        2
    sw1962  
    OP
       2016-09-28 21:06:15 +08:00
    @yidinghe 去重是否有快速的代码,我这条都 2 天了,还没完成

    就是想把 name 和 age 字段重复的去重
    yidinghe
        3
    yidinghe  
       2016-09-28 21:08:32 +08:00 via Android   ❤️ 1
    补充下,如果字段能排序的话,可以先创建非唯一索引,然后去重就方便多了:根据条件分段查询并排序,比方每次查 1000 条记录,删掉重复记录后,下次查询以最后一条记录为查询条件继续,直到查不出记录为止。
    sw1962
        4
    sw1962  
    OP
       2016-09-28 21:16:41 +08:00
    @yidinghe 这个倒没必要,看来要先建立索引再去重,这样速度会快一点
    lenmore
        5
    lenmore  
       2016-09-28 21:24:13 +08:00
    先建个 (name, age) 的索引吧,如果 Id 不是主键,把 id 也一块建了。
    msg7086
        6
    msg7086  
       2016-09-28 21:28:06 +08:00 via Android
    导出,加上唯一索引,导入。
    用 INSERT IGNORE 。
    msg7086
        7
    msg7086  
       2016-09-28 21:29:42 +08:00 via Android
    如果要留后来者的话则是用 REPLACE 导出导入。
    shiyiwan
        8
    shiyiwan  
       2016-09-28 21:44:41 +08:00
    在去重之前了解重复数据的多寡吗,占比是否超过 5%,还是 20%还是 50%?另外每条数据有多少列,占用空间是多少呢?
    如果需要删除的数据比较多,可以考虑先把保留的数据取出来放到一张临时表中,然后 truncate 本表,将临时表数据导入回去;
    如果需要删除的数据比较少,可以入 @lenmore 建议那样先针对(name, age)建索引,然后执行之前那条语句。

    另外,注意检查 name, age 列中是否存在 null 值,需要对其单独处理。
    ebony0319
        9
    ebony0319  
       2016-09-29 08:53:31 +08:00
    这个要看你的对数据库的写入的量。当有大量写入的时候。唯一约束会让插入非常慢。遇到这种情况可以考虑先全部写入,后面再去重,然后建立索引。建议用分页方法去重,那样比较快。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:31 · PVG 20:31 · LAX 04:31 · JFK 07:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.