【问题标题】:MySQL, load data from file, into number of tablesMySQL,将文件中的数据加载到表中
【发布时间】:2012-09-15 05:22:09
【问题描述】:

我的基本任务是尽可能快地将单个文件中的部分数据导入到多个不同的表中。

我目前每个表都有一个文件,我设法使用LOAD DATA 语法将每个文件导入到相关表中。

我们的产品收到客户的新要求,他不再有兴趣向我们发送多个文件,而是希望向我们发送包含所有原始记录的单个文件,而不是维护多个此类文件。

我想到了几个建议:

  1. 我可能会要求客户在文件中的每批行之前写一个原始文件,描述他希望将其加载到的表以及需要导入的前行数。 例如

    Table2,500 
    ...
    Table3,400 
    

    然后我可以尝试为每个这样的行块应用LOAD DATA,从而丢弃表和行号描述。 可行吗?

  2. 我可能要求每条记录都包含表名作为附加属性,然后我需要迭代每条记录并插入它,尽管我确信它比 LOAD DATA 慢得多。

    李>
  3. 我还可以使用例如 Java 预处理此文件并在 for 循环中执行 LOAD DATA as 语句。

我可能需要几乎任何我想要的格式更改,但它必须是一个文件并且导入必须快速。 (我不得不说,我所说的表描述是什么意思,它实际上是一个特性的不同名称,我决定所有与这个特性相关的文件都应该保存在不同的表名中——它对客户端是透明的)

听起来最好的解决方案是什么?他们还有其他建议吗?

【问题讨论】:

    标签: mysql insert load-data-infile


    【解决方案1】:

    这取决于您的数据文件。我们正在做类似的事情,并制作了一个小的 perl 脚本来逐行读取数据文件。如果该行包含我们需要的内容(例如以 table1 开头),我们知道它应该在表 1 中,因此我们打印该行。

    然后您可以将该输出保存到文件或命名管道并将其与 LOAD DATA 一起使用。

    与将其加载到临时表中并从那里加载到新表中相比,这可能具有更好的性能。

    perl 脚本(但你可以用任何语言编写)可以非常简单。

    【讨论】:

    • +1,谢谢,我很欣赏你的回答,因为你是根据经验说话的,我可能会使用 RAM 作为管道,因为主要客户端约束没有打开任何新文件(如果我愿意的话所以,我每 5 分钟就会有 200,000 个新文件)
    • 这就是我们所做的,我们从远程源获取数据,通过 unzip 管道传输,通过 perl 脚本管道传输并使用 LOAD DATA 进入 mysql。完美运行。
    【解决方案2】:

    您可能还有另一种选择,即定义一个表并将所有数据加载到该表中,然后使用 select-insert-delete 将该表中的数据传输到您的目标表。根据列的总数,这可能会也可能不会。但是,如果可能的话,您不需要编写外部 java 程序,并且可以完全依赖数据库来加载数据,这也可以为您提供更清洁和更优化的工作方式。您很可能需要一个额外的标记列,它可以是目标表的名称。如果是这样,则可以将其视为上述选项 2 的变体。

    【讨论】:

    • 虽然不是最优的,但是你需要维护这个单表的内存管理(删除,不是释放内存而是它自己)
    • 我同意。但是如何创建/删除此表?因为完成加载后,您不需要桌子。所以,你甚至不需要从表中删除?
    • 正如我所说的,这是一个选项,在这种情况下,最好使用在会话结束时取消分配的临时表。我正在寻找更有趣的选择。谢谢:-)
    猜你喜欢
    • 2014-09-08
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多