【发布时间】:2020-05-13 09:00:01
【问题描述】:
我试图更新我的数据库中的 50000 行,下面的代码应该这样做,但我总是得到一个错误:
错误:连接超时
我有一个可以更新超过 50k 条记录的 UPDATE 语句。我想分批更新它们 1000 或 10000。我试过了,但我无法得到想要的结果。
$sync_to ='master_trainee';
$connection = Yii::$app->getDb();
$this->clientdb = $clientdb = Yii::$app->get('clientdb');
$command2 = $clientdb->createCommand('SELECT * from psdftrainee WHERE change1 ='
."'".$sync_label."'". ' AND synced = 0 LIMIT 100' );
$data2 = $command2->queryALL();
$effected_date = date('Y-m-d H:i:s');
if (isset($data2)&& !empty($data2)) {
$sql1 = array();
foreach ($data2 as $val) {
$query = 'UPDATE ' .$sync_to. ' SET table_ID ='. "'".$val['ID']."'". ','
.'TraineeID =' ."'".$val['TraineeID']."'". ','
.'StatusChangeDate =' ."'".$val['StatusChangeDate']."'". ','
.'IsDual =' ."'".$val['IsDual']."'". ','
.'Assessment =' ."'".$val['Assessment']."'". ','
.'VoucherHolder =' ."'".$val['VoucherHolder']."'". ','
.'StatusReason =' ."'".$val['StatusReason']."'". ','
.'changeDate =' ."'".$val['changeDate']."'". ','
.'effected_on =' ."'".$effected_date."'".
' WHERE table_ID =' . "'".$val['ID']."'".' AND TraineeID=' . "'".$val['TraineeID']."'".' AND ClassID=' . "'".$val['ClassID']."'";
$commands = $connection->createCommand($query);
$res = $commands->execute();
$sql1[] = '('."'".$val['ID']."'".','."'".$val['TraineeID']."'".','."'".$val['ClassID']."'".')';
}
$synced = 'UPDATE ' .$sync_from. ' SET synced=1
Where (ID,TraineeID,ClassID) IN ('.implode(',', $sql1).')';
$cmd = $clientdb->createCommand($synced);
$cmd->execute();
$message = $sync_to." Table has updated successfuly <br>";
$msg_status = 1;
}else{
$message = $sync_to." Table has no data to updation <br>";
$msg_status = 0;
}
echo json_encode(array("message"=>$message, "code"=>$msg_status));<br>
我尝试了很多不同的方法,但都没有成功。
【问题讨论】:
-
在您采取进一步措施之前,请先了解一下sql注入以及准备好的和绑定的查询的重要性
-
不要使用迭代更新。对数据数组使用一个
INSERT .. ODKU查询。确保将用于记录更新标识的列组合定义为唯一索引。 -
你有2个选择,1)增加php超时设置,或者更好的方法,2)是批量处理你的数据,批量操作。
-
从控制台运行此命令 - 没有时间限制!
php insert_into_db.php -
对于 Strawberry 的评论,准备好的/绑定的查询将允许您使用单个 SQL 查询来更新任意数量的行,因为一旦准备好,可以使用不同的参数执行查询以获得出色的性能增加 - 这将避免使用单个
INSERT .. ODKU查询的缺点,因为如果查询过于庞大(数据包大小超出错误),这可能会失败
标签: php mysql database performance bulkupdate