- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到了一个 super 慢的 PDOStatement::fetchAll() ,这让我抓狂。我的查询运行时间不到 0.1 秒。同样在 MySQL 终端中,我在不到 0.1 秒的时间内将输出显示在屏幕上。但是在 PDOStatement 上运行 fetchAll() 需要 2.5 秒。
// $_DB is my PDO class instance.
$tStart = microtime(true);
$q = $_DB->prepare('SELECT id FROM ... WHERE ... LIMIT 1000');
$q->execute($aArgs);
var_dump(round(microtime(true) - $tStart, 5));
$aIDsFiltered = $q->fetchAll(PDO::FETCH_COLUMN, 0);
var_dump(round(microtime(true) - $tStart, 5));exit;
这个输出:
float(0.0612)
float(2.58708)
好吧,认真的吗?我怎样才能在不到 0.1 秒的时间内在 MySQL 控制台中获得结果,而 PHP 却需要 2.5 秒来获取这 1000 个结果并将其放入一个简单的数组中?来吧,一个简单的 for 循环将 1000 个数字一个一个地放入一个数组中需要 0.001 秒......!!!我在这里错过了什么?我可以使用什么作为替代品?我用谷歌搜索并搜索过,但找不到解决方案:(提前致谢!
编辑:fetchAll() 的持续时间不仅与返回结果的数量有关...而且与 $aArgs 的大小有关。不发送参数会使 fetchAll() 在 0.01 秒内返回,即使有 50K 个结果!为 execute() 调用提供 47K 个参数会使 fetchAll() 运行 120 秒。但这不是导致这种情况的大查询字符串的创建(顺便说一句,execute() 不是这样做的吗?),因为相同的 47K 参数,但 LIMIT 到 1K 结果只需要 2.5 秒......正如建议的那样,我已经验证 PDO 的 EXPLAIN 输出与使用 MySQL 控制台的输出相同。我也没有看到 MySQL 在努力工作,一直以来都是 Apache 进程(因此是 PHP)在占用 CPU。另外:使用旧的 mysql_* 接口(interface),获取结果需要 0.03 秒。
对于好奇的人:
最佳答案
您查询的 SQL 可以告诉我们一些信息。尝试运行 EXPLAIN SELECT ...
并查看查询计划是什么。检查索引是否被正确使用等。
然而,简单的执行调用和 fetchAll 调用之间的区别可能归结为以下几个因素:
mysqlnd
驱动程序还是旧版本?PDOStatement->execute
无论如何只返回一个 bool 值首先,我会确保您已为 PHP 分配了足够的内存和 CPU,并检查 PHP 正在使用的 mysql 驱动程序。它应该是mysqlnd
。
关于php - PDOStatement::fetchAll() 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22811983/
我有一个关于 PDO 的问题。 有区别吗 $sql = "SELECT * FROM pages"; $pdo = $this->db->query($sql); $result = $pdo->fe
这个问题最好的标题是“如何将字典列表转换为元组列表”,除非我不能 100% 确定这是正确的。 我正在修改我在网上找到的一个抓取工具,它使用 .fetchall() 从数据库中获取数据。 cur.exe
我有以下代码: $sql = "SELECT table.field, table2.field2 FROM table, table2"; $stmt
我想知道是否有人可以帮助阐明为什么这段 PHP 代码没有进入 for 循环?在 MySQL 中,查询返回我需要的相应行,但在这个 PHP 文件中,它无法将任何内容返回到数组中,因此不执行 foreac
我不断收到错误“AttributeError:‘Cursor’对象没有属性‘fetchAll’”。我的 rowCount 是 451,所有查询都正常。 我已经研究过这个问题,大多数错误都涉及在 cur
我有一个数据库,我正在尝试查询该数据库以获取要显示给用户的信息。我用过 fetch(PDO::FETCH_ASSOC) 检索单行之前或 $row = mysql_fetch_array($result
我完全是 PHP 和 MySQL 领域的新手。我正在读 Kevin Yank 的书,在做他的一个例子时,我遇到了一个奇怪的结果。我确信我遵循并正确输入了他书中写的代码,但我想知道为什么我没有得到相同的
我正在使用 zend 框架开发一个网络应用程序,我希望我的用户能够使用 zend fetchAll 函数从其他用户那里进行搜索。但它返回完整的专栏,我只想要几个值。这是我的示例代码: $query=$
我在 PHP 中有一个函数,它使用 SELECT SQL 查询。我在这样的查询中使用占位符变量 (?)。 (此占位符用于 mysql 数据库中的表名): protected function _fet
所以,这个网站上有很多这个问题的实例。 但是它们中的大多数都混合了一堆其他的东西,比如类、大量的参数等等。 我有一些非常基本的代码,不,真的,可能是最基本的: try { $connectio
我正在使用 fluentpdo - https://github.com/lichtner/fluentpdo 我正在尝试使用此代码将表中的结果循环到 html $bxslider = $fpdo->
这个问题在这里已经有了答案: Call to a member function on a non-object [duplicate] (8 个答案) 关闭 9 年前。 我不知道为什么它会返回 C
我正在使用 Python 从数据库中选择数据。 cur.execute("Select a,b,c from tab1") print "a,b,c" print "\n" data = cur.fe
同一个查询语句: fetchAll(): 复制代码 代码如下: array(1) {  
我想用 limit 做一个 fetchAll() 吗?您知道 symfony2 的实体管理器是否可行吗? 我当前的代码(获取所有,无限制): $repository = $this->getDoctr
我有一个从两个内部连接表中选择的 sql 查询。 select 语句的执行大约需要 50 秒。但是, fetchall() 需要 788 秒,并且只获取 981 个结果。这是查询和 fetchall
我有一个 php 类,用于通过 PDO 运行 SQL 语句。该类将 FetchAll 的数据存储到公共(public)变量中的该查询中,但问题是我不知道查询是什么,所以我最终在数据操作查询(INSER
我通过 ssh 连接到远程服务器,并在那里创建了两个 python 文件作为测试:一个用于创建数据库,另一个用于从中读取数据。 创建数据库的脚本 import os import sqlite3 #
我有这段有效的代码。数据库连接在文件的前面定义,与此处显示无关。安全地假设它工作正常 - 因为它是。 :-) try { $stmt = $conn->prepare("SELECT * FR
当我尝试执行以下代码时,我一直收到一个空数组: $this->DB->prepare('SELECT * FROM Articles WHERE Author = :username AND Time
我是一名优秀的程序员,十分优秀!