我正在读取包含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表包含700万条记录。

最佳答案

您确定脚本实际上可以检测行尾吗?如果没有,请尝试

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 />';
}


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

09-26 03:56