커맨드 라인에 대한 chrooted 액세스 권한을 가진 외부 공급자에 약 6 백만 곡의 ID가있는 MySQL 데이터베이스가 있습니다.큰 데이터베이스를 업데이트 할 때 PHP MySQL이 시간 초과 됨
거의 레코드 450에서 레코드가 950까지 업데이트되는 경우에도 잘못된 게이트웨이 오류가 발생합니다. 전체 데이터베이스와는 거리가 멀고 처리 방법을 모르겠습니다.
- : (6000 필기!)
이 흐름의 개요, 깊은 이해 한 후 의사를 다음과 같다 나는 또한 쿼리를 제한하려고했으나으로 멈출 것이라고 말했다과 수동 분할은 불가능하다
미리 감사드립니다 다른 테이블에 전체 노래 정보를 삽입 자세한 내용은 테이블에서 (JSON 결과에 REST) 외부 API
의사
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 쿼리를 맨 아래에 넣으려고했지만 명백하게 결과는 거의 같습니다. 들으
먼저
삽입을 배치하지 않는 이유는 무엇입니까? 'INSERT INTO 테이블 (col1, cols2) VALUES (record1, record1), (record2, record2), (record3, record3) 등등 ...'- 당신은 한 번에 AFAIK 수백 개의 레코드를 삽입 할 수 있습니다. 각각에 대한 쿼리. 또한 인서트는 인덱스가있는 경우 "비싸다"(6 개월 레코드 - 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 injection bug] (http://bobby-tables.com/)를 만들었 기 때문에 문자열 보간이나 연결을 사용하여 **이를 수행하지 마십시오. **'$ _POST' 또는'$ _GET' 데이터를 쿼리에 직접 입력하지 마십시오. 실수로 누군가를 악용하려고 시도하면 매우 위험 할 수 있습니다. – tadman
@cate_b 불행하게도 나는 불분명했다. post scriptum에서 읽을 수 있듯이, 나는 벌써 배치 삽입에 실패했다. – fab