PHP脚本超时时间过长
我正在读取一个包含1000行的csv文件。我对每一行执行一个查询,查询如下:PHP脚本超时时间过长,php,mysql,performance,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 AN
$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)
对此运行explain,只返回正在搜索的100行,并返回常量ref,这意味着它应该使用索引
现在在我的循环中,我有以下内容:
while ($line = fgetcsv($handle)){
$foobar->execute();
$data = $foobar->fetchAll(\PDO::FETCH_ASSOC);
var_dump($data); echo '<br /><br />';
}
while($line=fgetcsv($handle)){
$foobar->execute();
$data=$foobar->fetchAll(\PDO::FETCH\u ASSOC);
变量转储($data);回显“
”;
}
为什么要花很长时间?CSV文件中只有1000行,在查询中运行explain似乎足够快
它会在5-10分钟后超时,但不会花那么长时间,我不知道是什么问题
有一件事需要注意foo3表包含7百万条记录。尝试在控制台中启动该过程。请参阅after exec()。进程可以将有关进程状态的数据放在共享存储(mysql/file/etc…)中。仅仅因为查询“使用”索引,并不意味着“它应该很快”。速度取决于是否可以使用“正确”的索引,以及查询的构造是否高效 例如,您的查询使用:
WHERE foo1.Text LIKE :txt
如果foo1和/或foo1.Text中有许多行(即文本类型字段),并且:txt可能以%开头,则表示主表将无法使用索引
此外,所有必需的联接索引可能都不存在。例如,从查询中可以明显看出,字段foo3.ID不是主键
为了更好地回答“为什么要花很长时间?”的问题,我需要更多关于表foo1/2/3结构的信息。您是否确保脚本能够实际检测行尾?如果没有,那就试试看
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 />';
}
if($result=$stmt->fetchAll(PDO::FETCH_ASSOC))
{
foreach(结果为$res)
{
foreach($res as$key=>$val)
{
$temp[$key]=utf8_编码($val);
}
阵列推送($array,$temp);
}
变量转储($数组);
回音“
”;
}
另一方面,您的主要问题可能是查询本身。也许我给你的方法可以更快地解决问题。是否可能只有一行有问题?我将从CLI运行此命令开始;将输出更改为只记录行的索引及其执行所需的时间。这将有助于澄清问题。Hmmm。。。它运行得很慢,因为您对数据库发出了1000个查询?好主意,但是1000个查询需要10分钟?非常感谢($line=fgetcsv($handle)!==FALSE)完成了这项任务。我不知道false将使其立即执行。