Php 将批量数据导入MySQL

Php 将批量数据导入MySQL,php,mysql,performance,bulkinsert,Php,Mysql,Performance,Bulkinsert,所以我尝试将一些销售数据导入我的MySQL数据库。数据最初以原始CSV文件的形式存在,我的PHP应用程序需要首先处理该文件,然后将处理后的销售数据保存到数据库中 最初我做的是单独的INSERT查询,我意识到这是非常低效的(大约6000个查询需要2分钟)。然后,我生成了一个大型查询,并一次插入所有数据。这使我们的效率提高了3400%,并将查询时间缩短到略多于3秒 但据我所知,加载数据填充应该比任何类型的插入查询都要快。因此,现在我考虑将处理后的数据写入文本文件,并使用LOAD data infle

所以我尝试将一些销售数据导入我的MySQL数据库。数据最初以原始CSV文件的形式存在,我的PHP应用程序需要首先处理该文件,然后将处理后的销售数据保存到数据库中

最初我做的是单独的
INSERT
查询,我意识到这是非常低效的(大约6000个查询需要2分钟)。然后,我生成了一个大型查询,并一次插入所有数据。这使我们的效率提高了3400%,并将查询时间缩短到略多于3秒

但据我所知,
加载数据填充
应该比任何类型的
插入
查询都要快。因此,现在我考虑将处理后的数据写入文本文件,并使用
LOAD data infle
将其导入数据库。这是向数据库插入大量数据的最佳方式吗?还是我完全走错了路

我知道几千行主要是数字的数据在总体方案中并不多,但我正试图使这个intranet应用程序尽可能快速/响应。我还想确保,如果我们决定向其他公司发放该计划的许可证,这一过程会扩大

更新:

因此,我确实按照建议测试了
LOAD DATA infle
,认为这可能只会略微提高速度(因为我现在将相同的数据写入磁盘两次),但当它将查询时间从3300ms缩短到240ms时,我感到惊讶。页面仍然需要大约1500ms来执行total,但它仍然明显比以前好


从这里,我想我将检查数据库中是否有多余的索引,并且,由于除了两个表之外,我的所有表都是InnoDB,因此我将研究优化InnoDB缓冲池以优化总体性能。

您应该对您的方法很满意。我不确定加载数据填充比大容量插入快多少,但我听说过同样的事情,它应该更快


当然,您肯定会想做一些基准测试,但我认为值得编写一些测试代码。

加载数据填充
非常快,是将文本文件导入MySQL的正确方法。这是加速数据插入的推荐方法之一,根据以下内容,插入速度可提高20倍:


假设将处理后的数据写回文本文件比将其插入数据库快,那么这是一个很好的方法。

加载数据或多个插入将比单个插入好得多;加载数据可以为您节省一点点,您可能不太在意

在任何情况下,在一个事务中做很多但不太多-每个事务10000行通常感觉是正确的(注意:这与非事务引擎无关)。如果您的事务太小,那么它将花费所有时间将日志同步到光盘

大多数情况下,执行大插入操作将来自构建索引,这是一项昂贵且内存密集的操作

如果你需要表现

  • 拥有尽可能少的索引
  • 确保表及其所有索引适合您的innodb缓冲池(假设此处为innodb)
  • 只需添加更多的ram,直到您的表适合内存,除非这会变得非常昂贵(64G现在并不太贵)

如果你必须使用MyISAM,这里有一些肮脏的技巧可以让它变得更好,我将不再进一步讨论。

伙计们,我也有同样的问题,我的需求可能比一般的更具体,但我在这里写了一篇关于我的发现的帖子

根据我的需要,加载数据很快,但需要动态保存到平面文件,这意味着平均加载时间比大容量插入要长。此外,我不需要做超过200个查询,在我一次只做一个查询之前,我现在将它们放大,节省的时间在几秒钟之内


不管怎样,希望这能帮助你?

很有趣。对于许多用例来说,知道这一点肯定是很好的,尽管我对如何得到0.0013sec的数字有点困惑。(我不擅长统计。)Lese:这与标准偏差有关。我对标准差的理解是,它显示了与平均值的差异有多大。(Excel为我做了计算)。我的观点是,散装数据的标准偏差小于装载数据的标准偏差。对我来说,这意味着体积更快。这对我来说是决定这件事的最重要的因素。主要是因为这是在现场工作。希望这有意义?在这里查看更多信息:我确实知道这个问题很久以前就发布了,但我必须说,一次批量插入和加载数据填充之间的区别是节省的时间。我用INSERT从30秒/更多的时间加载了一个约11000行、30列的CSV文件,加载时间从10秒/更多。