【问题标题】:When querying large data sets, prevent script timeout查询大型数据集时,防止脚本超时
【发布时间】:2012-04-23 00:13:33
【问题描述】:

我有以下代码:

$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 次查询时会超时...除了增加脚本内存之外,防止超时的最佳方法是什么?

【问题讨论】:

  • @GabrielGartz:你能给我一个如何实现的工作示例吗?
  • 我喜欢 RolandoMySQLDBA 解决方案,但您也可以在循环语句中回显某些内容并使用 br.php.net/manual/en/function.flush.php 刷新它

标签: php mysql timeout


【解决方案1】:

为什么不将其作为单个查询运行???

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

替代

您也可以一次限制插入 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 更改为任何合理的正数。

【讨论】:

    【解决方案2】:

    您应该考虑使用INSERT ... SELECT 语句而不是运行大量的单个插入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 2010-09-26
      • 1970-01-01
      • 2011-02-18
      • 2010-12-30
      • 2011-04-26
      • 2022-11-07
      相关资源
      最近更新 更多