2012-04-10 33 views
3

我有以下代碼:當查詢大型數據集,防止腳本超時

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

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

可以理解的,腳本超時在大約150,000查詢...增加了腳本內存什麼是防止最好的辦法之外超時?

+0

你嘗試使用flush嗎? – 2012-04-10 17:14:32

+0

@GabrielGartz:你能給我一個如何實施的工作例子嗎? – kylex 2012-04-10 17:15:37

+0

我喜歡RolandoMySQLDBA解決方案,但您也可以在循環語句中回顯某些內容並使用http://br.php.net/manual/en/function.flush.php – 2012-04-10 17:20:16

回答

6

爲什麼不把它作爲單個查詢運行?

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

備選

你也可以扼殺你的INSERT 200同時

$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); } 

您可以將$commit_limit更改爲任何正數是合理的。

3

您應該考慮使用INSERT ... SELECT語句,而不是運行批次的單個插入。