删除重复行时超慢加载数据填充

vwkv1x7d  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(286)

在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;

我的table很简单:

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

在我使用php脚本加载其他表之前,它的速度非常快(3分钟内加载3gb),但是对于这个,加载1gb需要17分钟。
我不知道为什么,因为使用索引时,有些行丢失或损坏,我只是想知道为什么。如果有人在从csv加载数据时有其他方法来删除重复的行,我会非常感激。
提前谢谢。

ktca8awb

ktca8awb1#

用一个 REPLACE 基本上是先删除行,然后插入新行。你想做的是 IGNORE 相反。
阅读更多信息:13.2.7加载数据填充语法
replace和ignore关键字控制对在唯一键值上复制现有行的输入行的处理:
如果指定“替换”,则输入行将替换现有行。换句话说,主键或唯一索引的值与现有行相同的行。参见第13.2.9节“替换语法”。
如果指定ignore,将丢弃与唯一键值上的现有行重复的行。有关更多信息,请参阅ignore关键字和strict sql模式的比较。
如果您添加一个主键,也会更好。如果没有,mysql会隐式地为您创建一个。这个是不可见的,是uuid或bigint。我记不清楚了。无论如何,这并不是最佳的性能和存储方式。执行以下操作:

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

相关问题