(使用pdo)
所以我有一张表,我想要从中获取大约1 GB的表。与此同时,我正在操作我获取的数据,然后将其插入到其他多个表中。我的代码看起来像这样:
$stmt = $pdo->query("SELECT * FROM foo");
$stmt2 = $pdo->prepare("INSERT INTO bar (col1) VALUES (?)");
$stmt3 = //...etc
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$toInsert = doStuff($row['baz']);
$stmt2->execute(array($toInsert));
//etc.
}
每当我在整个表上运行脚本时,它就会耗尽内存。我可以给它更多,但我觉得有更好的方法。
我认为无缓冲的查询可能会解决问题,但我需要同时运行这些查询。
答案 0 :(得分:1)
当您从数据库中读取数据并在PHP中使用它时,PHP对象将获取内存以及MySQL(用于工作并返回结果)。
您的查询看起来很简单。您可以编写一个包含两个查询的语句。这样它就可以在没有PHP内存问题的情况下工作。
答案 1 :(得分:1)
可以使用无缓冲的查询进行读取并为插入操作设置另一个PDO连接吗?
答案 2 :(得分:-1)
尝试使用限制和偏移进行分页
$limit = 1000;
$offset = 0;
$stmt = $pdo->prepare("SELECT * FROM foo ORDER BY id ACC LIMIT :limit OFFSET :offset");
$hadResult = false;
do {
$stmt->bindParam(':limit', $pageSize, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$hadResult = true;
///do stuff
}
$offset += $limit;
} while($hadResult);