我在 PostgreSQL 9.2.4 上使用 PDO 并试图从具有数百万行的表中获取数据。我的查询返回大约 100.000 行。我不使用任何 PDOStatements 的 fetch 函数,我只是使用 PDO Objecte itels 的结果并循环遍历它。但随着时间的推移,它变得越来越慢。一开始它每秒获取 200 行。但越接近尾声,它就越慢。现在在第 30.000 行,它每秒只获取 1 行。为什么越来越慢。
我这样做,很简单:
$dbh = new PDO("pgsql...");
$sql = "SELECT x, y FROM point WHERE name is NOT NULL and place IN ('area1', 'area2')";
$res = $dbh->query($sql);
$ins_sql = "INSERT INTO mypoints (x, y) VALUES ";
$ins_vals = [];
$ins_placeholders = [];
foreach($res as $row) {
$ins_placeholders[] = "(?,?)";
$ins_vals = array_merge($ins_vals, [$row['x'], $row['y']]);
printCounter();
}
// now build up one insert query using placeholders and values,
// to insert all of them in one shot into table mypoints
函数 printCounter 只是增加一个 int var 并打印它。因此,在我从中创建插入语句之前,我可以看到它已经在该数组中放入了多少行。我使用一次性插入来加快速度,比进行 100.000 次插入要好。但是那个 foreach 循环随着时间的推移变得越来越慢。我怎样才能提高速度。fetch() 和在 foreach 中使用 pdostatement 的简单循环方法有区别吗?
当我启动这个 php 脚本时,查询大约需要 5-10 秒。所以这与表的设置方式以及我是否需要索引无关。我有其他表返回 100 万行,我不确定获取它们的最佳方法是什么。如果需要,我可以提高 PHP 的 memory_limit,所以对我来说最重要的是速度。
感谢任何帮助。