使用 PHP 在 MySQL 中加载数据文件而不带文件


load data infile without file in mysql with php

我每 30 秒以流式传输的方式接收一次文件。这些文件最多可以有 40 列和 50,000 行。这些文件是 txt 文件和制表符分隔。现在,我正在临时保存文件,将加载数据infile的内容保存到数据库中的临时表中,然后删除该文件。

我想避免保存和删除过程,而是将数据直接保存到数据库中。流是这里的$output

protected function run(OutputInterface $output)
{
    $this->readInventoryReport($this->interaction($output));
}

我一直在谷歌上搜索,试图找到一个"性能是一个大问题" - 证明答案,但我找不到一种好的方法,如果不将数据保存到文件并使用加载数据文件。我需要快速提供内容,并在将它们保存到临时表后使用这些内容。(使用内容更新其他表...

有没有处理这个问题的好方法,或者文件保存和删除方法以及加载数据文件会比其他解决方案更好吗?

我运行它的服务器有 SSD 和 32GB 的 RAM。

LOAD DATA INFILE是将大量数据低延迟摄取到 MySQL 中的最快方法。

你可以给自己写一个php程序,它使用预准备语句等,很好地将行插入到数据库中。如果你安排每几百行做一个COMMIT,并使用准备好的语句,并仔细编写代码,它会相当快,但不如LOAD DATA INFILE快。 为什么?单个行操作必须序列化到网络线路上,然后反序列化,一次处理一个(或两个或十个)。 LOAD DATA只是在本地收集您的数据。

听起来你有一个不错的MySQL服务器机器。但序列化仍然是一个瓶颈。

每 50 秒记录 30K,嗯?好多啊!这些数据是多余的吗?也就是说,后续一批数据中的任何行是否会覆盖前一批数据中的任何行?如果是这样,您也许可以编写一个程序来跳过已过时的行。