【问题标题】:Downloading Large Data Sets -> Text to MySQL or just to MySQL?下载大型数据集 -> 文本到 MySQL 还是只到 MySQL?
【发布时间】:2011-01-07 14:26:07
【问题描述】:

我正在通过 PHP 的 XML 查询下载大量数据,场景如下: - 查询记录 1-1000,下载所有部分(1000 个部分大约有 4.5 兆文本),然后在我查询下一个 1001 - 2000 时将它们存储在内存中,存储在内存中(可能高达 400k)

我想知道将这些条目写入文本字段是否会更好,而不是将它们存储在内存中,一旦完成下载,尝试将它们全部插入数据库或尝试将它们写入他们进来时的数据库。

任何建议将不胜感激。

干杯

【问题讨论】:

  • 先接收,接收完毕再写。否则,如果连接中断,您的数据流将被中断并且您会丢失数据。如果您需要上传大转储,请使用它来完成工作 -- ozerov.de/bigdump.php --- 干杯!

标签: php mysql xml text


【解决方案1】:

您可以像这样运行查询:

INSERT INTO table (id, text)
VALUES (null, 'foo'), (null, 'bar'), ..., (null, 'value no 1000');

这样做,您将一次性完成,并且解析器将被调用一次。您能做的最好的事情就是使用 MySQL's Benchmark 函数运行类似的东西,运行 1000 次插入 1000 条记录的查询,或 1000000 次插入一条记录。

(对不起上一个答案,我误解了这个问题)。

【讨论】:

    【解决方案2】:

    我想在您收到它们后立即将它们写入数据库。这将节省内存,并且您不必在最后执行慢 400 倍的查询。您将需要机制来处理此过程中可能出现的任何问题,例如在 399K 结果后断开连接。

    【讨论】:

      【解决方案3】:

      根据我的经验,最好将所有内容下载到一个临时区域,然后当您确定一切顺利时,将数据(或文件)移动到位。

      当您使用数据库时,您可能希望将所有内容转储到表中,如下代码:

      $error=false;
      while ( ($row = getNextRow($db)) && !error ) {
          $sql = "insert into temptable(key, value) values ($row[0], $row[1])";
          if (mysql_query ($sql) ) {
               echo '#';
          } else {
               $error=true;
          }
      }
      
      if (!error) {
          $sql = "insert into myTable (select * from temptable)";
          if (mysql_query($sql) {
              echo 'Finished';
          } else {
              echo 'Error';
          }
      }
      

      或者,如果您熟悉该表,您可以为新插入的行添加一个“新”标志字段,并在完成后更新所有内容。

      【讨论】:

        猜你喜欢
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多