我正在读取包含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 百万条记录。
答案 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运行它;将输出更改为仅记录行的索引和执行所花费的时间。这应该有助于澄清问题。