我遇到了一个超级慢的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秒...... !!!
我在这里错过了什么?我可以用什么作为替代品?我用Google搜索并搜索了我无法找到解决方案:(提前致谢!
编辑:fetchAll()的持续时间不仅与返回结果的数量有关,而且与$ aArgs的大小有关。不发送任何参数会使fetchAll()在0.01秒内返回,即使结果为50K!提供execute()调用47K参数使得fetchAll()需要120秒才能运行。但它不是创建导致这个问题的大型查询字符串(顺便说一句,执行(不执行)吗?),因为相同的47K参数,但LIMIT到1K结果只需2.5秒... 如上所述,我已经验证了与使用MySQL控制台相比,EXPLO输出与PDO相同。我也没有看到MySQL努力工作,它是Apache进程(因此PHP)一直在吃CPU。 另外:使用较旧的mysql_ *接口,获取结果需要0.03秒。
对于好奇:
答案 0 :(得分:0)
您的查询的SQL可以告诉我们一些。尝试运行EXPLAIN SELECT ...
并查看查询计划是什么。检查索引是否正确使用等等。
然而,简单的执行调用和fetchAll调用之间的区别可能有几个因素:
mysqlnd
驱动程序还是旧版本?PDOStatement->execute
只返回一个布尔值首先,我确保您已经为PHP分配了足够的内存和CPU,并检查PHP正在使用的mysql驱动程序。它应该是mysqlnd
。