所以我有一个“notes”字段,它将一行(assigned_user_id)更新为新的id。备注是约。 160k长。用户表约为300。
对于每个注释行,我将assigned_user_id与users表进行比较,如果找到匹配项,则获取新用户ID并更新notes表。冲洗重复:
//dis-allow timeout. Was timing out consistently under 100 rows changes.
set_time_limit(0);
ignore_user_abort(1);
//foreach note
$counter = 0;
foreach ( $msCRMAnnotations as $key=>$value)
{
//foreach user, check for match between assigned_user_id and id_mscrm
foreach( $sugarCRMUsers as $key2=>$value2 )
{
if($value['assigned_user_id'] == $value2['id_mscrm'] )
{
//give some output as to what is changing...
echo("Note #" . $counter++ . " - Note id " . $value['id'] . " is assigned to user " . $value2['user_name'] . ".<br />" );
$query = "
UPDATE `notes`
SET `assigned_user_id` = '" . $value2['id'] . "'
WHERE `id` = '" . $value['id'] . "' AND
`assigned_user_id` = '" . $value['assigned_user_id'] . "'
";
$DB->query($query);
//unset($query);
}
}
}
具体来说,我们正在将选择数据从MsCRM迁移到SugarCRM。这是项目的帐户/备注/用户阶段。
所以现在问题是......我怎样才能最好地重新考虑上面的代码以使其更具性能?非常感谢任何和所有帮助。
答案 0 :(得分:2)
假设来自评论:
尝试为这些列设置索引,以便更快地搜索。
答案 1 :(得分:0)
使用预备语句可能帮助。请参阅PDO::prepare。
$stmt = $pdo->prepare($query);
...
foreach (...) {
$stmt->execute($params);
}
...
此外,您可以使用REPLACE命令一次发出多个更新。根据主键的实现方式,这可能/可能不起作用:
REPLACE INTO `notes` (`id`, `assigned_user_id`)
VALUES
(?, ?),
(?, ?),
(?, ?),
(?, ?),
(?, ?)
...您还需要一组包含id和assigned_user_ids的参数。
[编辑] PDO可能决定模拟准备好的陈述。您可以使用$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE)
关闭此功能。分析这两种方式,看看什么最适合你。