MySQL / PDO FOUND_ROWS()有时会错误地返回0

时间:2015-12-04 19:55:39

标签: php mysql pdo laravel-4 sql-calc-found-rows

我们有一个laravel 4.1应用程序曾经在PHP 5.4下运行,但是自从升级到5.6.13(今天到5.6.14)后,我注意到查询已经开始有时为FOUND_ROWS()返回0 。在我们的一些查询中,它似乎是间歇性的,但在其他问题上,它更像是一个永久性的问题。

受影响最大的集合是具有子查询的集合。

我们正在使用PDO(我们不使用laravel模型,只是直接与其PDO对象进行交互)。 MySQL在这个时间框架内也没有被修改过。

尝试了所有种类 - 一个建议是将跟踪模式设置为0,但这并没有帮助。我尝试将PDO::MYSQL_ATTR_USE_BUFFERED_QUERY设置为false,但是当您尝试选择FOUND_ROWS()时,会导致PDO错误(现在无法获取确切的消息)。

没有回到5.4(请上帝没有),我完全陷入了困境......

直接在MySQL中运行这些查询,然后运行FOUND_ROWS() 始终会返回正确的结果。

4 个答案:

答案 0 :(得分:5)

New Relic有问题

New Relic Application有一些问题。 NewRelic应用程序监控守护程序或扩展程序正在干扰FOUND_ROWS()

的结果

目前的解决方法是=>

newrelic.transaction_tracer.explain_enabled = false

如何使用FOUND_ROWS

目前还不清楚你的sql PDO查询是什么。仍在尝试使用PDO使用FOUND_ROWS()。检查您是否使用相同的方式或请提供您正在尝试的一些查询。

$db = new PDO(DSN...); 
$db->setAttribute(array(PDO::MYSQL_USE_BUFFERED_QUERY=>FALSE)); 
$rs  = $db->query('SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 5,15'); 
$rs1 = $db->query('SELECT FOUND_ROWS()'); 
$rowCount = (int) $rs1->fetchColumn();  

答案 1 :(得分:0)

嗯,事实证明这是由于New Relic PHP插件。禁用此功能会立即修复所有返回零的FOUND_ROWS()个查询的问题。

答案 2 :(得分:0)

最近刚刚向New Relic通知了这一点,现在它已成为向开发人员提交的问题。

你可以在newrelic.ini配置中禁用explain_plans,这样你就可以解决问题并保持New Relic的APM报告而不必完全删除它,那么你只会在慢速查询报告页面上丢失解释计划,你否则应该具有所有New Relic功能,直到我们发布包含修复的代理。

如果您遇到一个问题,您认为需要完全卸载New Relic,请通过support.newrelic.com与我们联系,如果您是New Relic客户或者在pro试用或者discussion.newrelic.com上我们将积极监督和参与我们的公共论坛,并根据需要将其提请我们的开发人员注意。

感谢这个主题中的所有好消息,我将全力以赴帮助找到根本原因并解决这个问题。

答案 3 :(得分:0)

只是为了让你知道。我遇到了同样的问题,我可以确认问题是在 PHP Agent 6.6.0.169 (New Relic)之后修复的。我目前正在使用 PHP Agent 6.7.0.174 ,并且在 FOUND_ROWS()问题方面工作得很好。

干杯!