8

在阅读了几篇关于 PHP 的 PDOfetchall()函数的性能影响的文章后,我很好奇是否有另一种方法可以在不调用fetchall().

为了解释,大多数人同意这fetchall()往往是资源密集型的。就我而言,我认为这不会是一个太大的问题。是的,我必须从我的数据库中提取整个表并将其显示给用户,但它最多只有 100 行;我不相信这将是一个问题。但是,假设我需要提取 100,000 行,那么什么是更优化的解决方案?

4

2 回答 2

7

假设,如果您需要在单个响应中输出所有 100,000 行,您应该设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY为,执行查询,并使用fetchfalse一次迭代一行结果集。详细地说,无论您是否调用 fetchAll() 如果设置为 true,php 都会缓冲整个结果集。PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

好处是您大大减少了脚本的最大内存消耗,并且您可以更快地开始流式输出,尽管完成的总时间可能会或可能不会花费更长的时间。

我忽略了在这种极端情况下你应该考虑的其他事情,比如输出缓冲等......

于 2012-11-04T21:06:29.033 回答
2

另一种方法是在循环中逐行获取,如下所示:

while( $row = $statement->fetch() ){
    // so something with $row
}

显然,如果您需要所有行,例如用它们计算一些统计数据,那么上述方法不起作用。但是,在许多情况下,SQL 提供的解决方案允许您即时计算此类统计信息,并仅返回结果。

于 2012-11-04T19:55:48.200 回答