删除重复的行时超速加载数据文件

时间:2018-09-11 13:12:20

标签: mysql

我在mysql数据库中加载数据时遇到问题。我用这种方法在数据库中插入数据:

USE database;
ALTER TABLE country
ADD UNIQUE INDEX idx_name (`insee_code`,`post_code`,`city`);

LOAD DATA INFILE 'C:/wamp64/tmp/myfile-csv'
                         REPLACE
                         INTO TABLE `country` CHARACTER SET utf8
                         FIELDS TERMINATED BY ','
                         LINES TERMINATED BY '\r\n'
                         IGNORE 1 LINES;

我的桌子很简单:

CREATE TABLE `country` (`insee_code`  VARCHAR(250),
                        `post_code`   VARCHAR(250),
                        `city`        VARCHAR(250));

在我使用php脚本加载其他表之前,它相当快(3分钟内达到3GB),但是对于这个表,要花17分钟才能完成 加载1 GB。

我不知道为什么,因为有了索引,某些行会丢失或损坏,我只是想知道为什么。如果有人从CSV加载数据时,还有其他方法可以删除重复的行,我将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

基本上,您首先使用REPLACE删除该行,然后插入新行。您要做的是改为IGNORE

  

REPLACE和IGNORE关键字控制对输入行的处理,这些输入行   在唯一键值上复制现有行:

     
      
  • 如果指定REPLACE,则输入行将替换现有行。换句话说,对于主键或唯一索引具有相同值的行   作为现有行。请参见第13.2.9节“替换语法”。

  •   
  • 如果指定IGNORE,则将在唯一键值上复制现有行的行丢弃。有关更多信息,请参见比较   IGNORE关键字和严格SQL模式。

  •   

如果您添加主键,那就更好了。如果不这样做,MySQL会为您隐式创建一个。这个不可见,可以是uuid或bigint。我记不清楚了。无论如何,这并不是最佳的性能和存储方式。执行此操作:

ALTER TABLE country ADD column id int unsigned auto_increment primary key;