Php 通过MySql命令中的foreach循环加速执行
我有一个PHPPhp 通过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'] } 我的问题:对于大量图标来说,这变得非常缓慢 我的问题:我是否可以通
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的往返)。这并没有帮助。虽然这并不能免除循环,但这实际上可能是一个重要的改进。谢谢