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

时间:2013-12-12 15:28:24

标签: php mysql foreach

我有一个PHP foreach语句,循环遍历大量$icons

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

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

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

我的问题:我可以通过执行一个以某种方式包含foreach循环的MySql命令来加快速度吗?

非常有责任......

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您要更新多少个键?迭代是缓慢的,还是你做了几千次?

您可以使用“in”子句。

即:

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

你可以遍历for循环来构造一个传递给in的变量:

即:

 $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";

 }

答案 2 :(得分:0)

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

$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(); 

}