【问题标题】:Update thousands of rows in mysql database with php用php更新mysql数据库中的数千行
【发布时间】: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


【解决方案1】:

诀窍是按照它在磁盘上的排列顺序遍历表——PRIMARY KEY

做 1000,而不是 10K; 10K 可能会阻塞其他连接,但不会为UPDATE 带来太多好处。

这里是分块的详细信息:http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2016-02-27
    • 2014-01-04
    • 1970-01-01
    • 2014-01-15
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多