PDO fetchall()性能考虑因素?

时间:2012-11-04 19:09:25

标签: php mysql pdo

在阅读了几篇关于PHP的PDO fetchall()函数的性能影响的文章之后,我很好奇是否有另一种方法可以在不调用fetchall()的情况下完成相同的结果。

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

替代方法是在循环内逐个获取一行,如下所示:

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

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