首页 文章

PHP PDO如何在内部工作?

提问于
浏览
10

我想在我的应用程序中使用pdo,但在此之前我想了解内部PDOStatement->fetchPDOStatement->fetchAll .

对于我的应用程序,我想做类似“SELECT * FROM myTable”的操作并插入到csv文件中,它有大约90000行数据 .

我的问题是,如果我使用 PDOStatement->fetch ,因为我在这里使用它:

// First, prepare the statement, using placeholders
$query = "SELECT * FROM tableName";
$stmt = $this->connection->prepare($query);

// Execute the statement
$stmt->execute();
var_dump($stmt->fetch(PDO::FETCH_ASSOC));

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
{
echo "Hi";
// Export every row to a file
fputcsv($data, $row);
}

每次从数据库中获取后,该获取的结果是否会存储在内存中?

当我进行第二次获取时,内存将具有第一次获取的数据以及第二次获取的数据 .

因此,如果我有90000行数据,并且如果每次都进行提取而不是更新内存以获取新的提取结果而不删除先前提取的结果,那么对于最后一次提取内存将已经有89999行数据 .

  • 这是 PDOStatement::fetch 的工作方式吗?

  • 性能明智如何与 PDOStatement::fetchAll 叠加?

Update: Something about fetch and fetchAll from memory usage point of view

只是想在这个问题上添加一些东西,因为最近发现了一些关于fetch和fetchAll的东西,希望这会使这个问题值得人们将来访问这个问题以获得对fetch和fetchAll参数的一些理解 .

fetch不会在内存中存储信息并且它在行到行的基础上工作,因此它将通过结果集并返回第1行,而不是再次返回到结果集,而不是再次返回第2行,它将不会返回第1行和第2行但只返回第2行,因此fetch不会将任何内容存储到内存中,但fetchAll会将详细信息存储到内存中 . 因此,如果我们处理大小约为100K的结果集,那么fetch与fetchAll相比是更好的选择 .

2 回答

  • 3

    PHP通常将结果保存在服务器上 . 这一切都取决于司机 . MySQL可以在"unbuffered"模式下使用,但使用起来有点棘手 . 大型结果集上的 fetchAll() 可能导致网络泛滥,内存耗尽等 .

    在我需要处理超过1,000行的每种情况下,我都不使用PHP . 如果您的数据库引擎已经具有CSV导出操作,请考虑 . 很多人 .

  • 0

    我建议你使用 PDO::FETCH_LAZY 而不是 PDO::FETCH_ASSOC 来获取大数据 . 我用它逐行导出到csv,它工作正常 . 没有任何"out of memory"错误 .

相关问题