我有一个MySQL数据库,在外部提供程序上有大约600万首歌曲ID,具有对命令行的chrooted访问。PHP更新大型数据库时MySQL超时
我在约450条记录上收到了错误的网关错误,即使它一直保持更新直到记录950.它远离完整的数据库,我真的不知道如何处理它。我也试图限制查询,但表示,将停止和手动分离是不可能的(6000个笔迹!)
流程概述如下,更深入的了解后伪代码:
- 从表中检索歌曲的ID
- 查询细节的外部API(REST与JSON结果)
- 将完整的歌曲详细信息在不同的表
预先感谢您求助。
伪
ini_set('max_execution_time',0);//INFINITE
ini_set("memory_limit", "300M");//MAX SUPPORTED BY HOSTING
$query1 = "SELECT id FROM songs";
$sql = mysqli_query($link, $query1) or die("error");
while ($row = mysqli_fetch_assoc($sql)) {
$url = 'https://api.com/tracks?pass='.$pass.'&id='.$row["id"];
$content = file_get_contents($url);
$json = json_decode($content, true);//RETURNS "results" ARRAY
$query2 = "INSERT INTO songs_ok VALUES ";
foreach($json["results"] as $result){
$query2.= "(";
$query2.= $row["timestamp"].",";
$query2.= $row["artist"].",";
$query2.= "),";
$query2 = rtrim($query2,", ").";";
$sql2 = mysqli_query($link, $query2) or die("error");
}
}
附:我也尝试将INSERT查询置于底部,但显然结果几乎相同。 THX
为什么不批量插入? INSERT INTO table(col1,cols2)VALUES(record1,record1),(record2,record2),(record3,record3)等...' - 您可以一次插入AFAIK数百条记录,而不是用数据库每一个查询。另外,当你有索引(我希望你可以这样做)时,插入是“昂贵的”,所以它似乎有6m记录 - AFAIK - 索引必须用每个插入重新计算。通过像这样的快速运行循环和大量记录,看起来批量插入至少会有所帮助。 –
**警告**:使用'mysqli'时,您应该使用[参数化查询](http://php.net/manual/en/mysqli.quickstart.prepared-statements。php)和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **绝不**将'$ _POST'或'$ _GET'数据直接放入查询中,如果有人试图利用您的错误,这会非常有害。 – tadman
@cate_b不幸的是我不清楚。正如你可以在post scriptum中看到的,我已经尝试过批量插入失败。 – fab