- 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/
PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: 无效的参数数量:绑定(bind)变量的数量与标记数量不匹配 我收到此错
我的 vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php 的第 28 行 如下: class PDOStatement ext
如果我使用 phpmyadmin 执行一些查询,它会显示耗时 0.0002 秒,即 0.2 毫秒。如果我使用 PDO 通过 PHP 执行相同的查询,则耗时(仅适用于下面示例代码中的第三行)为 20 毫
查看 PHP 手册,任何时候都没有建议在列上包含重音符号。 例如:最近,我正在尝试运行以下函数: $pdo->prepare("UPDATE name_table SET convert= :con
废话不多说, 直接看代码: 复制代码 代码如下: <?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test&
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::setFetchMode讲解由作者收
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::setAttribute讲解由作者收
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::rowCount讲解由作者收集整理,
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::nextRowset讲解由作者收集整
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::getColumnMeta讲解由作者
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::getAttribute讲解由作者收
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::fetchObject讲解由作者收集
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::fetchColumn讲解由作者收集
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::fetchAll讲解由作者收集整理,
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::fetch讲解由作者收集整理,如果你
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::execute讲解由作者收集整理,如
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::errorInfo讲解由作者收集整理
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::errorCode讲解由作者收集整理
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::columnCount讲解由作者收集
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP PDOStatement::closeCursor讲解由作者收集
我是一名优秀的程序员,十分优秀!