【问题标题】:PHP MySQL running query in batchesPHP MySQL 批量运行查询
【发布时间】:2012-01-04 17:21:40
【问题描述】:

我是处理大量数据的新手。我想知道在批量查询数据库时是否有任何最佳实践,或者是否有人可以提供任何建议。

我有一个查询将提取所有数据,并且 PHP 用于将数据写入 XML 文件。可以有 10 到 500,000 行数据之间的任何地方,因此我编写了脚本以分批 50 提取数据,写入文件,然后获取接下来的 50 行,将其附加到文件等。这样好吗还是我应该做其他事情?我可以增加批处理大小还是应该减少它以使脚本运行得更快?

任何建议将不胜感激。

【问题讨论】:

  • 你可以使用mysqldump --xml转储你的数据库

标签: php mysql batch-processing


【解决方案1】:

是的,为了获得巨大的结果,建议使用批处理(性能和内存原因)。

Here is benchmark and example code of running query in batches

【讨论】:

  • 是的,但如果您有内存限制或将结果流式传输给用户,这是 MySQL 中唯一的解决方案。
  • 一次大提取会更快,但问题通常是脚本执行超时。所以这篇文章讨论的是通过脚本而不是 MySQL LIMIT 功能来分割工作
  • 感谢本文作者。
【解决方案2】:

做到这一点的最佳方法取决于几个不同的事情。最重要的是创建此 XML 文件的时间和原因。

如果您是按需创建 XML 文件,而用户正在等待该文件,那么您需要进行一些微调和性能测试。

如果它是定期创建的,可能是每晚或每小时的任务,然后在构建后请求 XML 文件(类似于 RSS 提要构建器),那么如果你有工作,我建议不要搞乱它。

就性能而言,有不同的事情可以提供帮助。将一些简单的计时器放入您的脚本中,并使用每批的记录数,看看是否有任何性能差异。

$start = microtime(true);
//process batch
$end = microtime(true);
$runTimeMilliseconds = $end - $start;

如果问题是用户反馈,您可以考虑使用 AJAX 启动每个批次并向用户报告进度。如果您向用户提供反馈,他们通常会乐于等待更长的时间,而不是仅仅等待整个页面刷新。

另外,请检查您的 SQL 查询以确保那里没有隐藏的性能损失。 http://dev.mysql.com/doc/refman/5.0/en/explain.html EXPLAIN 可以向您展示 MySQL 如何处理您的查询。

在极端情况下,我认为最好的性能可以通过并行处理来实现。我没有在 PHP 中使用过它,但这里是主要参考 http://www.php.net/manual/en/refs.fileprocess.process.php

根据您的托管环境,您可以找到记录总数并将其拆分到子进程中。每个都构建自己的 XML 片段。然后你可以组合碎片。所以进程 1 可以处理记录 0 到 99,进程 2 100 到 199,等等。

【讨论】:

    【解决方案3】:

    您会感到惊讶,一个简单的无限制全选是最快的,
    因为它只查询一次数据库,
    其他一切都在本地处理

    $sql = select all_columns from table;
    
    <?php
    // set a very high memory
    
    // query without limit, if can avoid sorting is the best
    
    // iterate mysql result, and set it to an array
    // $results[] = $row
    // free mysql_result
    
    // write xml for every one thousand
    // because building xml is consuming MOST memory
    for ($i=0; $i<$len; ++$i)
    {
      $arr = $results[$i];
      // do any xml preparation
    
      // dun forget file-write is expensive too
      if ($i%1000 == 0 && $i > 0)
      {
        // write to file
      }
    }
    ?>
    

    【讨论】:

      【解决方案4】:

      解决此问题的最佳方法是将其安排为 CRON 作业,我认为这是 PHP 中批处理的最佳解决方案。检查此链接以获取更多信息! Batch Processing in PHP。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 2010-10-14
        • 2016-01-03
        • 2012-02-12
        • 1970-01-01
        相关资源
        最近更新 更多