我是处理大量数据的新手。我想知道在批量查询数据库时是否有任何最佳实践,或者是否有人可以给出任何建议。
我有一个查询将提取所有数据,PHP用于将数据写入XML文件。因此可以存在10到500,000行数据之间的任何数据,因此我可以通过脚本将数据分批拉出50,写入文件,然后获取接下来的50行,将其附加到文件等。这样就可以了或者我应该做别的事情?我可以增加批量大小,还是应该减少它以使脚本运行得更快?
非常感谢任何建议。
答案 0 :(得分:4)
是的,对于巨大的结果,建议使用批次(性能和内存原因)。
Here is benchmark and example code of running query in batches
答案 1 :(得分:1)
这样做的最佳方式取决于几件不同的事情。最重要的是您何时以及为何创建此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等等。
答案 2 :(得分:1)
你会感到惊讶一个简单的选择所有没有限制是最快的,
因为它只查询数据库一次,
其他一切都在本地处理
$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
}
}
?>
答案 3 :(得分:1)
解决此问题的最佳方法是将其安排为CRON作业,我认为这是PHP批处理的最佳解决方案。查看此链接了解更多信息! Batch Processing in PHP。希望这会有所帮助。