【发布时间】:2012-03-31 20:40:39
【问题描述】:
我有一个简单的脚本,可以从远程 MySQL 服务器一次提取大约 1 亿个结果,并更新我的本地数据库。远程服务器不受我的控制,因此无法进行某种主/从设置以进行自动更新。正常执行需要几个小时,但我意识到从远程服务器提取结果的代码部分和更新本地条目的代码部分需要大致相同的时间来执行。因此,理论上,如果我在更新本地条目时从远程服务器获取下一批行,我可以将执行时间缩短近一半。我已经在 PHP 中看到了一些用于并行数据库查询的示例代码(例如,问题 322275),但我想不出一种方法让它与我的脚本中的 foreach 更新循环一起工作。这在 PHP 中是否可行,或者我最好使用另一种语言,如 Python 或 Ruby(尽管我没有这两种语言的经验)?
编辑:另外,远程服务器位于地球的一半,因此网络延迟相当高。
示例代码:
for ($i = 0; $i < 100; $i++)
{
$min = $i * LIMIT;
$max = ($i + 1) * LIMIT;
$updates = $db_remote->fetchAll("SELECT * FROM table_name WHERE content_id >= $min AND content_id < $max"); // Pull 1 million results from the remote SQL server
foreach ($updates as $u)
{
$db_local->update("UPDATE table_name SET ... WHERE content_id = $u['content_id'] LIMIT 1"); // Update each of the local entries
}
}
【问题讨论】:
-
mysqlnd 的异步 API 似乎非常实验性。如果你在 *NIX 上,只需 fork,它可能会简单得多。
标签: php mysql parallel-processing