PHP MySQL批量运行查询
我不熟悉处理大量数据。我想知道在批量查询数据库时是否有任何最佳实践,或者是否有人可以提供任何建议 我有一个将提取所有数据的查询,PHP用于将数据写入XML文件。可以有10到500000行的数据,因此我编写了脚本,将数据分50批提取出来,写入文件,然后获取接下来的50行,将其附加到文件中,等等。这样可以吗,还是我应该做其他事情?我可以增加批处理大小,还是应该减少它以使脚本运行更快PHP MySQL批量运行查询,php,mysql,batch-processing,Php,Mysql,Batch Processing,我不熟悉处理大量数据。我想知道在批量查询数据库时是否有任何最佳实践,或者是否有人可以提供任何建议 我有一个将提取所有数据的查询,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限制功能。