MySQL,将数据从文件加载到多个表中

MySQL,将数据从文件加载到多个表中,mysql,insert,load-data-infile,Mysql,Insert,Load Data Infile,我的基本任务是尽可能快地将一个文件中的部分数据导入到几个不同的表中 我目前每个表都有一个文件,我通过使用LOAD DATA语法将每个文件导入到相关表中 我们的产品收到客户的新要求,他不再有兴趣向我们发送多个文件,而是希望向我们发送包含所有原始记录的单个文件,而不是维护多个此类文件 我想到了几个建议: 我可能会要求客户在文件中的每批行之前写入一个raw,描述他希望加载到的表以及需要导入的前几行的数量。 e、 g 然后,我可以尝试为每个这样的行块应用加载数据,丢弃表和行号描述可行吗? 我可能要求每条

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

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

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

我想到了几个建议:

  • 我可能会要求客户在文件中的每批行之前写入一个raw,描述他希望加载到的表以及需要导入的前几行的数量。 e、 g

    然后,我可以尝试为每个这样的行块应用
    加载数据
    ,丢弃表和行号描述可行吗?

  • 我可能要求每条记录包含表名作为附加属性,然后我需要迭代每条记录并插入它,尽管我确信这比加载数据要慢得多

  • 我还可以使用Java等预处理该文件,并在for循环中执行
    LOAD DATA
    as语句

  • 我可能需要几乎任何格式的变化,我的愿望,但它必须是一个单一的文件和导入必须是快速的。 (我必须说,我所说的表描述实际上是一个功能的不同名称,我已经决定该功能的所有相关文件都应以不同的表名保存,这对客户端是透明的)


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

    您可以有另一个选择,即定义一个表并将所有数据加载到该表中,然后使用“选择插入删除”将数据从此表传输到目标表。根据列的总数,这可能是可能的,也可能是不可能的。但是,如果可能的话,您不需要编写外部java程序,可以完全依赖数据库来加载数据,这也可以为您提供一种更干净、更优化的工作方式。您可能需要有一个额外的标记列,它可以是目标表的名称。如果是这样,可以将其视为上述选项2的变体。

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

    然后,您可以将该输出保存到文件或命名管道,并将其与加载数据一起使用

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


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

    虽然不是最佳脚本,但您需要维护这个表的内存管理(删除,不是释放内存,而是释放内存),我同意。但是创建/删除这个表怎么样?因为在你完成装载后,你就不需要桌子了。所以,您甚至不需要从表中删除?正如我所说的,这是一个选项,在这种情况下,最好使用在会话结束时取消分配的临时表。我正在寻找更有趣的选择。谢谢:-)+1,谢谢,我很感激你的回答,因为你是根据经验说话的,我可能会将RAM用作管道,因为主要的客户端约束是不打开任何新文件(如果我这样做,我将每5分钟有200000个新文件)。这就是我们要做的,我们从远程源获取数据,通过解压缩管道传输数据,通过perl脚本将其导入mysql,并加载数据。工作完美。
    Table2,500 
    ...
    Table3,400