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