PHP SQL 在 php 中构建的数千行中每行更新一个字段,每行都不同

PHP SQL UPDATE one field per row in thousands of rows all different each constructed in php

我有一个 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 循环中,因此 运行s 10k 次 >30 秒并超时。

我需要: 1 获取所有行(如果我做一个 pre select 可以获取单行但是接缝就像加倍并且获取看起来高效和快速)。 获取很多行中的所有数据,我们需要其他行中的所有数据,只有一些字段,但每天都在变化。

$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 外的参数,然后在 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)

似乎 dB table 本身有一个问题,除了这个写入问题外,没有显示 detectable 错误。

所以

Export table as text (SQL dump)
Drop table
Restore table (with the SQL dump backup)

现在 THEN WHEN 方法是最快的,直到语句长度达到最大值。

下一个最快的是 foreach 循环之外的 bind_param,迈克尔建议的版本(谢谢)这是目前正在运行的版本。