使用重复数据加速LOAD DATA INFILE - 250 GB

时间:2015-07-14 00:45:56

标签: mysql duplicates innodb load-data-infile

我正在寻找关于是否有任何方法可以加速从大约两个源csv文件中导入大约250 GB数据到MySQL表(InnoDB)的建议。每个30 GB。 csv本身没有重复,但确实包含文件之间的重复 - 事实上,所有8个csv文件中都会出现一些单独的记录。因此,需要在流程中的某个时刻删除这些重复项。我当前的方法创建一个带有主键的空表,然后使用八个“LOAD DATA INFILE [...] IGNORE”语句来顺序加载每个csv文件,同时删除重复的条目。它适用于小样本文件。但是对于真实数据,第一个文件加载大约需要1个小时,第二个文件大约需要2个小时,第三个文件大于5个小时,第四个文件超过9个小时,这就是我现在所处的位置。看来随着表格的增长,将新数据与现有数据进行比较所需的时间也在增加......这当然是有道理的。但是还有四个文件可供使用,如果我让它继续运行,看起来可能还需要4到5天才能完成。

我会更好地导入表中没有索引的所有内容,然后删除重复项吗?或者我应该将8个csv中的每一个导入到单独的临时表中,然后执行联合查询以创建没有重复的新统一表?或者这些方法需要花费多长时间?

1 个答案:

答案 0 :(得分:0)

计划A

你有一个重复数据删除列;我们称之为name

CREATE TABLE New (
    name ...,
    ...
    PRIMARY KEY (name) -- no other indexes
) ENGINE=InnoDB;

然后,一次1 csv:

* Sort the csv by name (this makes any caching work better)

LOAD DATA ...

是的,类似于计划A的东西可以使用临时表来完成,但它可能不会更快。

计划B

将所有csv文件排序在一起(可能unix“sort”可以在一个命令中执行此操作吗?)。

B计划可能是最快的,因为它在I / O方面非常有效。