假设我有
$db is an instance of Zend_Db_Adapter_Abstract and
$sql = 'SELECT blah blah FROM table' will return a huge number of records.
有两个代码片段来处理返回的数据,如下所示。
// Code fragment 1 (let's call it C1).
$results = $db->fetchAll($sql);
foreach ($results as $row) {
// Process $row
}
// Code fragment 2 (let's call it C2).
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
// Process $row
}
我的理解是C1会将所有返回的数据加载到$results中。因此,大量数据被加载到 PHP 内存中。以下是我的问题。
- C2 是将所有数据加载到 PHP 内存中,还是像准备/执行一样逐一处理?
- 假设没有其他选择,C1 还是 C2 是更好的选择?
谢谢!
最佳答案
您的预感是正确的。至少如果您使用的是 PDO 驱动程序,->fetch() 会读取未缓冲的结果,而 ->fetchAll() 会返回一个大数组中的所有数据。
请注意,如果您正在使用 ->fetch(),则必须注意在循环中尝试执行的操作。当您仍然有一个未缓冲的结果集时,您不能在同一个连接上运行其他查询。
因此,如果您的计划是在循环内更新那些相同的行,则需要找到一种方法来延迟执行更新(通过排队然后以某种方式排队)直到您退出循环。
关于php - Zend_Db : fetchAll() or query()/fetch() for a huge number of records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465944/