快速删除MySQL中的重复记录

时间:2015-10-01 15:32:28

标签: mysql sql duplicates distinct

我正在尝试将非常大的SQL转储(大约3700万行)导入InnoDB表。有大量的重复和我想要实现的是,不改变实际转储想要防止重复行插入。字段email可能有重复项。我尝试了以下内容:将整个转储导入db后,我尝试执行以下SQL:

set session old_alter_table=1;
ALTER IGNORE TABLE sample ADD UNIQUE (email);

但第二次查询工作大约1小时,然后我刚刚取消了这个查询。

什么是摆脱重复的正确方法?

我有几个想法:

  • 也许在开始导入之前创建一个具有唯一索引的表,并在插入时防止重复而不会损害整个过程?
  • 也许在导入转储后选择不同的电子邮件并插入另一个表?

2 个答案:

答案 0 :(得分:0)

来自.dump文件

导入时,使用-f进行"强制":

mysql -f -p < 2015-10-01.sql

这会导致在遇到错误后继续导入,如果在导入之前创建唯一键约束,则在这种情况下这很有用。

来自.csv文件

如果您正在使用&#34; LOAD DATA&#34;,请使用&#34; IGNORE&#34;,例如:

LOAD DATA LOCAL INFILE 'somefile.csv' IGNORE
    INTO TABLE some_db.some_tbl
        FIELDS TERMINATED BY ';'
               OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
    (`somefield1`,`somefield2`);

根据documentation

  

如果指定IGNORE,则复制唯一的现有行的行   键值被丢弃。

这要求您在导入之前创建唯一键约束,这将在空表上快速创建。

答案 1 :(得分:0)

按如下方式编辑转储文件:

  1. 修改CREATE TABLE语句,在email字段中添加唯一键,或在其后添加ALTER TABLE语句。

  2. 查找所有INSERT INTO sample语句,并将其更改为INSERT IGNORE INTO sample

  3. 您也可以使用管道执行第2步:

    sed 's/INSERT INTO sample/INSERT IGNORE INTO sample/' sample_table.dump | mysql -u root -p sample_db
    

    如果文件太大而无法编辑以添加ALTER TABLE语句,我建议您使用--no-create-info选项创建转储到mysqldump,并手动创建表格(使用加载转储文件之前的唯一键。