Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO fetchall()性能注意事项?_Php_Mysql_Pdo - Fatal编程技术网

Php PDO fetchall()性能注意事项?

Php PDO fetchall()性能注意事项?,php,mysql,pdo,Php,Mysql,Pdo,在阅读了几篇关于PHP的PDOfetchall()函数对性能影响的文章后,我很好奇是否有其他方法可以在不调用fetchall()的情况下实现相同的结果 为了解释,大多数人同意fetchall()往往是资源密集型的。就我而言,我认为这不会是一个太大的问题。是的,我必须从我的数据库中提取一个完整的表并向用户显示它,但它最多大约是100行;我不认为这会成为一个问题。假设,如果我需要拉100000行,什么是更理想的解决方案 另一种方法是在循环中获取一行接一行,如下所示: while( $row = $s

在阅读了几篇关于PHP的PDO
fetchall()
函数对性能影响的文章后,我很好奇是否有其他方法可以在不调用
fetchall()的情况下实现相同的结果


为了解释,大多数人同意
fetchall()
往往是资源密集型的。就我而言,我认为这不会是一个太大的问题。是的,我必须从我的数据库中提取一个完整的表并向用户显示它,但它最多大约是100行;我不认为这会成为一个问题。假设,如果我需要拉100000行,什么是更理想的解决方案

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

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

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

假设,如果需要在单个响应中输出所有100000行,则应将
PDO::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY
设置为
false
,执行查询,并使用一次迭代一行结果集。更详细地说,如果
PDO::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY
设置为true,则无论是否调用fetchAll(),php都会缓冲整个结果集

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


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

如果你需要一次内存中的所有行,我会认为FutChALL会是一条路。我认为它将迭代/获取保持在
C
端,因此它应该比循环语句并在php端填充自己的数组更快。解决方案是不要一次提取100000行。您只需要在此时获取所需的信息,以便完成应用程序的工作。除非您需要一些广泛的统计计算,否则我很少看到您一次需要全部10万行的情况。假设,我明白你的意思。10万美元只是一种夸张;关键是要简单地呈现一种情况,即
fetchall()
变得过于资源密集而不实用。在这一点上,什么是更理想的解决方案?我敢肯定,在性能不可避免地成为一个考虑因素的情况下,还有其他人需要向用户提供大量数据。