【问题标题】:speed up execution by foreach loop in MySql command通过 MySql 命令中的 foreach 循环加快执行速度
【发布时间】:2013-12-12 15:28:23
【问题描述】:

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

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

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

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

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

非常感谢...

【问题讨论】:

  • 你想完成什么?您是否在每次添加新图标时都更新图标序列?
  • 是的。您可以通过执行一个包含 foreach 循环的 MySql 命令来加快速度。查看联接
  • @Strawberry,您所说的查看联接是什么意思? JOINS 就像加入一个表或另一个查询一样?如果有,怎么做?
  • $key 是如何派生的?是从数据库来的吗?

标签: php mysql foreach


【解决方案1】:

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

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

【讨论】:

  • 这当然假设首先在单独的表中获取所有更新是可行的。
  • 这是可行的 - 我假设只有键值的相对顺序很重要,所以只需使用自动增量键对临时表执行批量插入语句,然后图标将按正确的顺序排列.最后,运行这个 UPDATE 并删除临时表。
  • 有趣。不确定这是否适用于我的实际用例,这比显示的要复杂。但我会试一试。
【解决方案2】:

您要更新多少个密钥?是迭代速度慢,还是你这样做了数千次?

您可以使用“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";

 }

【讨论】:

    【解决方案3】:

    如果您使用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(); 
    
    }
    

    【讨论】:

    • 我们试图省去循环(特别是到数据库的往返)。这没有帮助。
    • 虽然这并不能免除循环,但这实际上可能是一个重要的改进。谢谢,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2017-07-04
    相关资源
    最近更新 更多