PHP Script Times Out花了太长时间

时间:2013-03-07 15:23:12

标签: php mysql performance

我正在读取包含1000行的csv文件。我为每一行执行一个查询,这里是查询:

$foobar = 
    SELECT foo1.ID
    FROM foo1
    INNER JOIN foo2 ON foo2.ID = foo1.ID
    LEFT JOIN foo3 bar1 ON bar1.ID = foo1.ID
    LEFT JOIN foo3 bar2 ON bar2.ID = foo1.ID
    WHERE foo1.Text LIKE :txt
    AND foo2.col1 = 31 AND bar1.col1 = 138 AND bar2.col1 = 271
    AND (bar1.col2 = "" OR bar1.col2 IS NULL) 
    AND (bar2.col2 = "" OR bar2.col2 IS NULL)

对此进行了解释并仅返回了搜索的100行,并且常量 ref 意味着它应该快速使用索引

现在我的循环中有以下内容:

while ($line = fgetcsv($handle)){
    $foobar->execute(); 
    $data = $foobar->fetchAll(\PDO::FETCH_ASSOC);
    var_dump($data); echo '<br /><br />';
}

为什么需要很长时间? CSV文件中只有1000行,查询的运行说明似乎足够快。

它在5-10分钟后超时,但它不应该花那么长时间我不知道这是什么问题。

有一点需要注意 foo3 表包含 7 百万条记录。

4 个答案:

答案 0 :(得分:1)

您是否确定该脚本可以实际检测到行结尾?如果没有,请尝试

ini_set('auto_detect_line_endings',TRUE);

您似乎没有指定数据的长度,请尝试以下方法:

$line = fgetcsv($handle, 1000)

在浏览PHP手册之后,最常用的方法是检查

while (($line = fgetcsv($handle, 1000)) !== FALSE)

我还注意到你在你的fetchAll语句中添加了一个\,试试这个:

fetchAll(PDO::FETCH_ASSOC)

你也可以做这样的事情来处理数据:

if($result = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
    foreach($result as $res)
    {
        foreach($res as $key=>$val)
        {
            $temp[$key] = utf8_encode($val);
        }
        array_push($array, $temp);
    }
    var_dump($array);
    echo '<br /><br />';
}

另一方面,您的主要问题可能是查询本身。也许我给你的方法可以更快地实现。

答案 1 :(得分:0)

尝试在控制台中启动该过程。请参阅exec()。该过程可以将数据放入共享存储(mysql / file / etc ...)中关于进程状态。

答案 2 :(得分:0)

仅仅因为查询“使用”索引,并不意味着“它应该快”。速度取决于是否可以使用“正确”索引以及查询是否有效。

例如,您的查询使用:

WHERE foo1.Text LIKE :txt

如果foo1和/或foo1中有很多行.Text是一个大的(即一个TEXT类型字段),并且:txt可能以%开头,那么这意味着主表将无法使用索引。

此外,所有必需的连接索引可能都不到位。例如,从您的查询中很明显,字段foo3.ID不是主键..

为了更好地回答“为什么需要很长时间?”这个问题,我需要更多关于表格foo1 / 2/3结构的信息。

答案 3 :(得分:0)

是否有可能只有一行存在问题?我首先从CLI运行它;将输出更改为仅记录行的索引和执行所花费的时间。这应该有助于澄清问题。