我在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加载数据时,还有其他方法可以删除重复的行,我将不胜感激。
谢谢。
答案 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;