2012-04-10 30 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语句,而不是运行批次的单个插入。