我有一個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