当前位置: 首页 > 面试题库 >

PDO :: fetchAll与PDO :: fetch在循环中

尹欣怿
2023-03-14
问题内容

只是一个简单的问题。

在循环中使用PDO :: fetchAll()和PDO :: fetch()是否有性能差异(对于大型结果集)?

我正在获取用户定义类的对象,如果有什么不同的话。

我最初的未经教育的假设是fetchAll可能会更快,因为PDO可以在一条语句中执行多个操作,而mysql_query只能执行一条。但是,我对PDO的内部工作原理知之甚少,文档也对此一无所知,而fetchAll()是否只是转储到数组中的PHP端循环。

有什么帮助吗?


问题答案:

几乎没有200k随机记录的基准。与预期的一样,fetchAll方法更快,但需要更多的内存。

Result :
fetchAll : 0.35965991020203s, 100249408b
fetch : 0.39197015762329s, 440b

使用的基准代码:

<?php
// First benchmark : speed
$dbh = new PDO('mysql:dbname=testage;dbhost=localhost', 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT * FROM test_table WHERE 1';
$stmt = $dbh->query($sql);
$data = array();
$start_all = microtime(true);
$data = $stmt->fetchAll();
$end_all = microtime(true);

$stmt = $dbh->query($sql);
$data = array();
$start_one = microtime(true);
while($data = $stmt->fetch()){}
$end_one = microtime(true);

// Second benchmark : memory usage
$stmt = $dbh->query($sql);
$data = array();
$memory_start_all = memory_get_usage();
$data = $stmt->fetchAll();
$memory_end_all = memory_get_usage();

$stmt = $dbh->query($sql);
$data = array();
$memory_end_one = 0;
$memory_start_one = memory_get_usage();
while($data = $stmt->fetch()){
  $memory_end_one = max($memory_end_one, memory_get_usage());
}

echo 'Result : <br/>
fetchAll : ' . ($end_all - $start_all) . 's, ' . ($memory_end_all - $memory_start_all) . 'b<br/>
fetch : ' . ($end_one - $start_one) . 's, ' . ($memory_end_one - $memory_start_one) . 'b<br/>';


 类似资料:
  • 问题内容: 如下代码: 输出: 两次运行“ foreach”不是我的目的,我很好奇为什么两个“ foreach”语句仅输出一次结果? 以下是类似情况: 输出: 但是,当我从上述代码中删除第一个“ foreach”时,输出将变为正常: 输出: 为什么会这样? 问题答案: 一个(你有)是向前光标。这意味着,一旦消耗(第一次迭代),就不会后退到结果集的开头。 您可以在之后关闭光标,然后再次执行该语句:

  • 问题内容: 这可能是一个简单的问题,但正在努力了解如何解决。我有一个允许用户选择“自定义”或“所有”人员的表格来分配给工作。 如果选择了custom,则用户通过单击每个复选框来选择人员,然后将其插入作业表中。这将产生下面的数组(3、1、10是职员ID) 如果选择了“所有人员”,我首先查询一条select语句以从人员表中获取所有人员ID,然后将它们插入到作业表中,方法同上。但是,这产生了数组: 如何

  • 问题内容: 我无法从fetchAll获取数据以选择性打印。 在普通的mysql中,我这样做: 在PDO中,我遇到了麻烦。我绑定了参数,然后将获取的数据保存到上述的$ rs中,目的是以相同的方式循环遍历它。 现在出现了麻烦部分。我如何在PDO上做些什么来获得与上述while循环匹配的东西?我知道我可以使用print_r()或dump_var,但这不是我想要的。我需要做以前可以使用普通mysql进行的

  • 问题内容: 我在使用PDO将多个记录插入数据库时​​遇到麻烦。我可以成功添加一条记录,但是一旦添加循环,它就会失败。在阅读了与此相关的许多其他SO问题之后,我相信我需要“绑定”我的变量,尽管我对正确的语法完全感到困惑。 这是我创建的原始函数: 在类似于此: 更新: 对于那些感兴趣的,这是我修复错误后的最终功能: 问题答案: 您不需要绑定变量。香港专业教育学院以前用类似的代码做到这一点。很难说出什么

  • 问题内容: 我正在尝试使用PHP构建Web应用程序,并且正在使用memcached从数据库存储用户数据。 例如,假设我有以下代码: 我不太确定如何读取变量并从中获取数据。我将需要能够阅读电子邮件和密码列。 我希望有人可以向我解释这是如何工作的。 谢谢 问题答案: PDOStatement :: fetch 从结果集中返回一行。该参数告诉PDO将结果作为关联数组返回。 数组键将与您的列名匹配。如果您

  • 问题内容: 我目前正在通过切换到PDO来更新我的应用。我有以下代码: 在上面的代码之后,var $ productidLst为1,2,我想使用与此等效的PDO: 我已经尝试了多种组合,但是没有成功,因此对此提供任何帮助将不胜感激(在第二个代码块$ res中是sql)。其次,我将参数$ productidLst设置为INT是否正确或应该是字符串? --------------------更新1 --