PHP SQL UPDATE 数千行中每行一个字段,每个字段都在 php 中构建

标签 php mysql sql-update

我有一个 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/

相关文章:

php - MongoDB NumberLong 在 PHP 中显示

php - 更改数组的索引名称

php - div 每 6 个结果在里面 PHP MYSQL

PHP 从 MySQL 填充文本框并更新回来

mysql - Symfony2 DBAL 更新方法返回 0

php - 从 MySQL 中的另一个查询调用查询并仅获取 1 个 JSON

php - 这么多框架使用服务器端表单和 Javascript 处理?

php - 验证年龄是否超过 18 岁

mysql - 如何检查服务器是否打开并显示消息框

mysql - SQL IF 逐日存在做增量更新否则插入数据