PHP - 从mysql

时间:2017-07-24 14:40:33

标签: php mysql pdo

(使用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.
}

每当我在整个表上运行脚本时,它就会耗尽内存。我可以给它更多,但我觉得有更好的方法。

我认为无缓冲的查询可能会解决问题,但我需要同时运行这些查询。

3 个答案:

答案 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);