【问题标题】:speed up LOAD DATA INFILE with duplicates - 250 GB加快 LOAD DATA INFILE 重复项 - 250 GB
【发布时间】:2015-10-02 10:52:36
【问题描述】:

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

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

【问题讨论】:

  • 这里的无形资产太多了。在没有索引的情况下导入所有内容,然后在以后整理出重复项总体上比您现在所做的要快。您必须尝试通过中间表是否更快。

标签: mysql duplicates innodb load-data-infile


【解决方案1】:

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 的“排序”可以在一个命令中完成?)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多