Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MySQL批量运行查询_Php_Mysql_Batch Processing - Fatal编程技术网

PHP MySQL批量运行查询

PHP MySQL批量运行查询,php,mysql,batch-processing,Php,Mysql,Batch Processing,我不熟悉处理大量数据。我想知道在批量查询数据库时是否有任何最佳实践,或者是否有人可以提供任何建议 我有一个将提取所有数据的查询,PHP用于将数据写入XML文件。可以有10到500000行的数据,因此我编写了脚本,将数据分50批提取出来,写入文件,然后获取接下来的50行,将其附加到文件中,等等。这样可以吗,还是我应该做其他事情?我可以增加批处理大小,还是应该减少它以使脚本运行更快 任何建议都将不胜感激。是的,对于巨大的结果,建议使用批处理(性能和内存方面的原因) 实现这一点的最佳方法取决于两个不同

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

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


任何建议都将不胜感激。

是的,对于巨大的结果,建议使用批处理(性能和内存方面的原因)


实现这一点的最佳方法取决于两个不同的方面。最重要的是您创建此XML文件的时间和原因

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

如果它是在常规基础上创建的,可能是夜间或每小时的任务,然后在构建XML文件后请求它(类似于RSS提要生成器),那么如果您的工作正常,我建议不要弄乱它

就性能而言,有不同的东西可以提供帮助。在脚本中加入一些简单的计时器,并处理每批记录的数量,看看是否有任何性能差异

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

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

另外,检查SQL查询以确保没有隐藏的性能损失。EXPLAIN可以向您展示MySQL如何处理您的查询

在极端情况下,我认为通过并行处理可以实现最佳性能。我没有在PHP中使用过它,但这里是主要的参考


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

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

$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
  }
}
?>
$sql=从表中选择所有列;

实现这一点的最佳方法是将其安排为CRON作业,我认为这是PHP中批处理的最佳解决方案。有关详细信息,请查看此链接。希望这有帮助。

您可以使用
mysqldump--xml
转储数据库,但如果内存有限或将结果流式传输给用户,这是MySQL中唯一的解决方案。一次大的获取速度会更快,但问题通常是脚本执行超时。因此,由于本文作者的贡献,本文讨论了将工作分片,但通过脚本,而不是MySQL限制功能。