【问题标题】:Insertion efficiency of a large amount of data with SQL使用 SQL 插入大量数据的效率
【发布时间】:2013-08-07 19:32:17
【问题描述】:

我有一个程序用于读取 CSV 文件并将数据插入数据库。我遇到了麻烦,因为它需要能够一次插入大记录(最多 10,000 行)数据。起初,我让它循环并一次插入每条记录。这很慢,因为它调用了一个插入函数 10,000 次......接下来我尝试将它组合在一起,以便一次插入 50 行。我认为这种方式将不得不更少地连接到数据库,但它仍然太慢了。将多行 CSV 文件插入数据库的有效方法是什么?另外,我必须在数据进入数据库之前编辑一些数据(例如,如果两个相同,则在用户名中添加 1)。

【问题讨论】:

  • 使用LOAD DATA INFILE 命令
  • @MikeW 你从我的键盘上取出了单词。文档的第一行是“LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读取到表中。”。如果你把它作为一个答案,我会支持你。
  • 不幸的是,我认为 LOAD DATA INFILE 命令不起作用,因为我必须在一些数据进入数据库之前对其进行编辑。感谢您的建议,但还有其他想法吗?
  • @user1423793 需要做什么编辑?如果正确设置命令,LOAD DATA 可以在加载时重新格式化和处理数据。也许如果您在问题中发布更多信息,我们可能会更加专注。
  • 我必须更改一些内容,例如如果两个相同,则在用户名中添加 1,或者如果没有提供用户名或密码,则生成用户名或密码。

标签: php mysql database-connection sql-insert


【解决方案1】:

对于文本文件,您可以使用LOAD DATA INFILE 命令,该命令旨在执行此操作。默认情况下,它将处理 CSV 文件,但具有处理其他文本格式的广泛选项,包括重新排序列、忽略输入行以及在加载数据时重新格式化数据。

【讨论】:

    【解决方案2】:

    所以我最终使用 fputcsv 将我更改的数据放入一个新的 CSV 文件,然后我使用 LOAD DATA INFILE 命令将新 csv 文件中的数据放入表中。这将其从 1000 个条目的 120 秒超时更改为 10,000 个条目大约需要 10 秒。感谢所有回复的人。

    【讨论】:

      【解决方案3】:

      我有一个疯狂的想法:您能否运行多个并行脚本,每个脚本负责处理 CSV 中的一堆行。

      类似这样的事情:

      <?php
      
      // this tells linux to run the import.php in background,
      // and releases your caller script.
      //
      // do this several times, and you could increase the overal time
      $cmd = "nohup php import.php [start] [end] & &>/dev/null";
      exec($cmd);
      

      另外,您是否尝试过将这些 50 个批量插入的限制增加到 100 或 500 个?

      【讨论】:

      • 是的,我尝试将 50 次批量插入的限制更改为最多 1000 次,但在 120 秒后超时。运行并行脚本会占用与我已经在做的一样多或更多的内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多