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

Php 通过MySql命令中的foreach循环加速执行,php,mysql,foreach,Php,Mysql,Foreach,我有一个PHPforeach语句,循环遍历大量的$icons 对于每个图标,需要更新DB列序列。详情如下: foreach ($icons as $key => $icon) { // MySql pseudo-code: UPDATE `tbl_icon2album` SET `sequence`= $key +1 WHERE iconID= $icon['id'] } 我的问题:对于大量图标来说,这变得非常缓慢 我的问题:我是否可以通

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

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

foreach ($icons as $key => $icon) {
    // MySql pseudo-code:
    UPDATE `tbl_icon2album` 
    SET `sequence`= $key +1 
    WHERE iconID= $icon['id']       
}
我的问题:对于大量图标来说,这变得非常缓慢

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

非常感谢…

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

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

}
如果使用,则可以准备查询一次,绑定参数,然后在循环中执行。这可能会更快,因为它通常是在准备需要花费时间的查询。例如:

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

}

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

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

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

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

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

你可以用“in”子句

即:

您可以迭代for循环来构造传递给的变量:

即:


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

你可以用“in”子句

即:

您可以迭代for循环来构造传递给的变量:

即:



你想完成什么?是否每次添加新图标时都要更新图标序列?此答案可能有帮助:是。您可以通过执行一个包含foreach循环的MySql命令来加快速度。看见JOINS@Strawberry,你所说的see JOINS是什么意思?在联接一个表或另一个查询时联接?如果是,如何生成?$key是如何生成的?是db的吗?你想做什么?是否每次添加新图标时都要更新图标序列?此答案可能有帮助:是。您可以通过执行一个包含foreach循环的MySql命令来加快速度。看见JOINS@Strawberry,你所说的see JOINS是什么意思?在联接一个表或另一个查询时联接?如果是,如何生成?$key是如何生成的?它是从数据库来的吗?当然,这首先假设在一个单独的表中获取所有更新是可行的。这是可行的-我假设只有键值的相对顺序是重要的,所以只需使用自动增量键对临时表执行一个mass insert语句,然后图标将按正确的顺序排列。最后,运行此更新并删除temp table.interest。我不确定这是否能在我的实际用例中工作,这个用例比所示的更复杂。但我会尝试一下。当然,这首先假设在一个单独的表中获取所有更新是可行的。这是可行的-我假设只有键值的相对顺序是重要的,所以只需使用自动递增键对临时表执行一个mass insert语句,然后图标将按正确的顺序排列。最后,运行此更新并删除temp table.interest。我不确定这是否能在我的实际用例中工作,这个用例比所示的更复杂。但我会尝试一下,我们正在尝试取消循环(特别是到DB的往返)。这并没有帮助。虽然这并不能免除循环,但这实际上可能是一个重要的改进。谢谢,我们正在尝试取消循环(特别是到DB的往返)。这并没有帮助。虽然这并不能免除循环,但这实际上可能是一个重要的改进。谢谢