我正在读取包含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 />';
}
另一方面,您的主要问题可能是查询本身。也许我给您的方法可以更快地得到结果。