【问题标题】:MySQL / PDO FOUND_ROWS() sometimes falsely returning 0MySQL / PDO FOUND_ROWS() 有时错误地返回 0
【发布时间】:2016-03-09 20:41:18
【问题描述】:

我们有一个以前在 PHP 5.4 下运行的 laravel 4.1 应用程序,但是自从升级到 5.6.13(今天升级到 5.6.14)后,我注意到查询开始有时会返回 0 来表示 FOUND_ROWS()。在我们的一些查询中,它似乎是断断续续的,但在其他查询中,它更像是一个永久性问题。

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

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

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

没有回滚到 5.4(请上帝不要),我完全被卡住了......

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

【问题讨论】:

  • PDO 对象是否返回正确数量的实际数据行,例如,您要求返回用户数,它说 FOUND_ROWS() 0 个用户,但返回 4 个数据行,用于 4 个不同用户?
  • 其他一切正常 - 如果我的查询有 45 个结果,我会得到前 30 个(从限制中),然后运行找到的行并返回 0。
  • 你能用相关代码编辑你的问题吗?
  • 并非如此,因为这种情况发生在多个查询中,并且仅在一种环境中 - 它也是间歇性的,有时也有效(所以我知道查询不是问题)。直接使用 MySQL 时也可以正常工作。
  • 我们需要查看代码。 Laravel 具有允许“事件”触发和执行的内部机制,可能是在您完成查询后,PDO 对象被更改,随后对您需要的调用丢失。你能隔离重现代码和环境吗? “有时有效,有时无效”不足以进行任何类型的调试,您必须隔离并能够重复返回错误结果的情况。

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


【解决方案1】:

New Relic 有问题

新遗物申请有一些问题。 NewRelic 应用程序监控守护进程或扩展正在干扰FOUND_ROWS() 的结果

当前的解决方法是 =>

newrelic.transaction_tracer.explain_enabled = false

如何使用 FOUND_ROWS

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

$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();  

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      最近才向 New Relic 通知了此问题,因此现在已向开发人员提交了一个问题。

      您可以在 newrelic.ini 配置中禁用 explain_plans,这将允许您解决您的问题并保留来自 New Relic 的 APM 报告,而无需完全删除它,那么您只会在慢查询报告页面上丢失解释计划,您否则在我们发布包含修复程序的代理之前应该拥有所有 New Relic 功能。

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

      感谢此线程中提供的所有有用信息,我将全部反馈,以帮助找到根本原因并解决此问题。

      【讨论】:

        【解决方案4】:

        只是为了让你知道。我遇到了同样的问题,我可以确认该问题在 PHP Agent 6.6.0.169 (New Relic) 中/之后得到解决。我目前正在使用 PHP Agent 6.7.0.174,它在 FOUND_ROWS() 问题方面运行良好。

        干杯!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-04
          • 2012-10-06
          • 2021-12-27
          • 1970-01-01
          • 2018-05-13
          • 1970-01-01
          • 2018-05-21
          • 1970-01-01
          相关资源
          最近更新 更多