通过MySql命令中的foreach循环加快执行速度


speed up execution by foreach loop in MySql command

我有一个PHP foreach语句,循环通过大量的$icons

对于每个图标,需要更新DB列sequence。如下:

foreach ($icons as $key => $icon) {
    // MySql pseudo-code:
    UPDATE `tbl_icon2album` 
    SET `sequence`= $key +1 
    WHERE iconID= $icon['id']       
}

我的问题:对于大量图标来说,这会变得非常缓慢。

我的问题:我可以通过执行一个MySql命令来加快速度吗?

非常感谢。。。

您可以将所有更新放在另一个表中,并使用单个查询进行更新,例如

 UPDATE tbl_icon2album, some_other_table
 SET    sequence = some_other_table.new_key_value
 WHERE  iconID = some_other_table.icon_reference

您正在更新多少个密钥?是迭代很慢,还是你这样做了数千次?

你可以使用"in"子句。

即:

 update table set key=key+1 where blah in ('1','2','3');

您可以通过for循环进行迭代,构建一个传递到中的变量:

即:

 $iconlist = "";
 foreach ($icons as $key => $icon) {
   if (!$iconlist) { $iconlist = "($icon" }
   else 
   { $iconlist .= ",$icon" }
 }
 if ($iconlist) { 
   $iconlist .= ")";
   $query = "update table set key=key+1 where icon in $iconlist";
 }

如果使用prepared语句,则可以准备查询一次,绑定参数,然后在循环中执行。这可能会更快,因为准备查询通常会占用时间。例如:

$stmt = $mysqli->prepare("
  UPDATE
    `tbl_icon2album`
  SET
    `sequence` = ?
  WHERE
    `iconID` = ?
");
$stmt->bind_param('ii', $sequence, $icon_id);
foreach ($icons as $key => $icon)
{
  $sequence = $key + 1;
  $icon_id = $icon['id'];
  $stmt->execute(); 
}