mysql - 加快通过 Select 语句循环的 SQL 更新语句
问题描述
在代码中发现一个 SQL 查询需要 31 分钟才能完成(1900 秒)。首先一条 select 语句获取 1955 行,然后代码循环遍历这些行以根据该记录集中的数字运行更新。它运行的表有 14,000 行。我怎样才能加快速度?
$sql = "select id, did, customer_id from dids";
$rs = $db->PDOquery($sql, $qry_arr);
//Loop through all DIDs and attach to cdrs select id, did, customer_id from dids
while($row=$rs->fetch()){
$qry_arr = array(':did_id' => $row['id'],
':customer_id' => $row['customer_id'],
':did' => $row['did']);
$sql = "update ".$billing_table." c ";
$sql .= "set c.did_id = :did_id, c.customer_id = :customer_id ";
$sql .= "where c.customer_id = 0 and c.telcom_num = :did ";
$result=$db->PDOquery($sql, $qry_arr);
set_time_limit(30); //Reset time limit after each query
if (!$result) {
error_log(date("Y/m/d h:i:sa").": "."\nError In Sql.\n".$sql, 3, $cron_log);
}
}
尝试使用以下内容,但收到错误提示错误代码:1054。“where 子句”中的未知列“dids.did”
UPDATE ".billing_table." SET ".billing_table.".did_id = dids.id, ".billing_table.".customer_id = dids.customer_id WHERE dids.did = ".billing_table.".telcom_num
解决方案
序列化 SQL 查询通常会导致性能下降。您可以在一个语句中完成所有操作:
$sql = "update ".$billing_table." c ".
"inner join dids d on d.did=c.telcom_num ".
"set c.did_id = d.id, c.customer_id = d.customer_id ".
"where c.customer_id = 0;";
推荐阅读
- sql - 在 Google BigQuery 中投射不合适?
- google-apps-script - 使用应用程序脚本更改 gsuite 签名返回“isDefault 无法切换为 false”
- javascript - 照片长度问题
- java - Jackson 将对象数组反序列化为 pojo
- android - 需要类型不匹配:Editabel 找到:字符串
- java - 如何在java中指示空白
- facebook - 使用 Facebook Graph Api 获取 Facebook 页面评论的“FROM”字段
- python - Python 3 对象创建消耗大量内存
- javascript - 未调用Javascript鼠标单击(向下/向上)
- java - 仅使用 charAt() 替换字符串字符