我有一个 Large_table,其中包含名为 1 (ID) 到 10 和 10k 多行的字段。
Update 语句会导致速度减慢,以致某些记录根本无法更新。
如果我运行
UPDATE Large_table SET SOME_FIELD = '$testdata'
PHP 需要 <1 秒,因此 WHERE 子句才是问题所在。
正在运行
UPDATE Large_table SET SOME_FIELD = 'apple' WHERE ID ='1'
来自 php,它位于 foreach 循环中,因此运行 10k 次 >30 秒并超时。
我需要: 1 获取所有行(如果我进行预选择,则可以获取单行,但这就像加倍一样,并且获取看起来高效且快速)。 获取很多行中的所有数据,因为我们需要其他行中的所有数据,只有一些字段,但每天都会变化。
$stmt = $conn->prepare("SELECT * FROM Large_table "); $stmt->execute(); // Works quick.
foreach ($stmt as $row){
echo $row['1'];// works at .8 sec sometimes less
$testdata = 'apple';
//PHP CONSTRUCT THE OUTPUT Field for each row differently depending upon id and other feilds - so for testing lets call it $testdata = 'apple' and assume it changes as the issue is not in this part
$stmt = $conn->prepare("UPDATE Large_table SET SOME_FIELD = '$testdata' WHERE ID = '$row['1']' "); $stmt->execute();
}
我尝试了 CASE THEN WHEN complied 方法,但是 sql 语句变得可怕,所以 surly 不可能是执行此操作的最佳方法。
那么实现这一目标最快最有效的方法是什么?
最佳答案
尝试准备更新语句并在 foreach
外部绑定(bind)参数,然后在 foreach
内设置参数并执行语句。
$update = $conn->prepare("UPDATE Large_table SET SOME_FIELD = ? WHERE ID = ?");
$update->bind_param('si', $testdata, $id);
foreach ($stmt as $row)
{
$id = $row[1];
$testdata = 'apple'; // I'm guessing in the real code this changes per row?
$update->execute();
}
如果这仍然需要很长时间,那么您可以随时使用 set_time_limit(0)
.
关于PHP SQL UPDATE 数千行中每行一个字段,每个字段都在 php 中构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28914679/