为什么我们的查询会卡在 MySql 中的“Writing to net”状态?

2024-01-08

我们有很多疑问

select * from tbl_message

卡在“正在写入网络”状态。该表有 98k 行。

问题是......我们甚至没有从我们的应用程序中执行任何类似的查询,所以我想问题是:

  • 什么可能会生成查询?
  • ...以及为什么它会陷入状态“写入网络”

我觉得问这个问题很愚蠢,但我 99,99% 确定我们的应用程序没有对我们的数据库执行类似的查询...但是,我们正在使用 WHERE 语句对该表执行几个查询:

 SELECT Count(*) as StrCount FROM tbl_message WHERE m_to=1960412 AND m_restid=948

 SELECT Count(m_id) AS NrUnreadMail FROM tbl_message WHERE m_to=2019422 AND m_restid=440 AND m_read=1

 SELECT * FROM tbl_message WHERE m_to=2036390 AND m_restid=994 ORDER BY m_id DESC

我已经多次搜索我们的应用程序select * from tbl_message但还没有找到任何东西...但是我们的 mysql 服务器上的查询日志仍然充满了Select * from tbl_message queries


由于应用程序不会神奇地生成它们喜欢的查询,因此我认为应用程序中的某个地方很可能存在错误导致了这种情况。您可以使用以下一些建议来追踪它。我猜您使用的是 PHP,因为您使用的是 MySQL,所以我将在示例中使用它。

尝试在应用程序中的所有查询前面添加注释,如下所示:

$sqlSelect  = "/* file.php, class::method() */";
$sqlSelect .= "SELECT * FROM foo ";
$sqlSelect .= "WHERE criteria";

该评论将显示在您的查询日志中。如果您使用某种数据库 api 包装器,您可能会自动添加这些消息:

function query($sql)
{
    $backtrace = debug_backtrace();
    // The function that executed the query
    $prev = $backtrace[1];
    $newSql = sprintf("/* %s */ ", $prev["function"]);
    $newSql .= $sql;

    mysql_query($newSql) or handle_error();
}

如果您不使用包装器,而是直接执行查询,则可以使用 runkit 扩展和函数runkit_function_rename https://www.php.net/manual/en/function.runkit-function-rename.php重命名 mysql_query (或您正在使用的任何内容)并拦截查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们的查询会卡在 MySql 中的“Writing to net”状态? 的相关文章

随机推荐