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,迈克尔建议的版本(谢谢)这是目前正在运行的版本。
我有一个 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,迈克尔建议的版本(谢谢)这是目前正在运行的版本。