2012-04-10 14 views
3

を防ぐため、大規模なデータセットを照会:防ぐ最良の方法です何スクリプトメモリを増やすの外...約150,000クエリで私は次のコードを持っているスクリプトのタイムアウト

$query = mysql_query("SELECT * FROM mytable"); 

while($row = mysql_fetch_assoc($query)){ 
    mysql_query("INSERT INTO mytable2 (col1, col2) 
       VALUES ('".$row['val1']."', '".$row['val2']."')"); 
} 

当然のことながら、スクリプトがタイムアウトをタイムアウト?

+0

あなたはフラッシュを使用しようとしましたか? –

+0

@GabrielGartz:それがどのように実装されるかの実例を教えてください。 – kylex

+0

私はRolandoMySQLDBAソリューションが好きですが、ループ文に何かをエコーし​​てhttp://br.php.net/manual/en/function.flush.phpでフラッシュすることもできます –

答えて

6

なぜ単一のクエリとして実行しますか?

$SQL = "INSERT INTO mytable2 (col1,col2) SELECT val1,val2 FROM mytable"; 
$query = mysql_query($SQL); 

ALTERNATIVE

あなたはあなたが合理的である正のどんな数に$commit_limitを変更することができ、時間

$query = mysql_query("SELECT * FROM mytable"); 
$commit_count = 0;  
$commit_limit = 200; 
$comma = ""; 
$SQL = "INSERT INTO mytable2 (col1, col2) VALUES "; 
while($row = mysql_fetch_assoc($query)){ 
    $SQL .= $comma . "('".$row['val1']."','".$row['val2']."')"; 
    $comma = ","; 
    $commit_count++; 
    if ($commit_count == $commit_limit) 
    { 
     mysql_query($SQL); 
     $SQL = "INSERT INTO mytable2 (col1, col2) VALUES "; 
     $commit_count = 0;  
     $comma = ""; 
    } 
} 
if ($commit_count > 0) { mysql_query($SQL); } 

であなたのINSERT 200をも絞ることができます。

3

lotの単一挿入を実行する代わりにINSERT ... SELECT文を使用することを検討する必要があります。