为什么我们的查询卡在MySql中的"写入网络"状态?

Fre*_*rik 5 mysql

我们有很多疑问

select * from tbl_message
Run Code Online (Sandbox Code Playgroud)

陷入"写入网络"的状态.该表有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
Run Code Online (Sandbox Code Playgroud)

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

Emi*_*l H 9

由于应用程序不会像他们喜欢的那样神奇地生成查询,因此我认为很可能是应用程序中的某个地方出现了错误导致此问题.以下是您可以用来跟踪它的一些建议.我猜你使用PHP,因为你使用MySQL,所以我会用它作为我的例子.

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

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

评论将显示在您的查询日志中.如果您正在使用某种类型的数据库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();
}
Run Code Online (Sandbox Code Playgroud)

如果你没有使用包装器,而是直接执行查询,你可以使用runkit扩展和函数runkit_function_rename来重命名mysql_query(或者你正在使用的任何东西)并拦截查询.

  • en.wikipedia.org/wiki/Heisenbug#Heisenbug:"heisenbug(以海森堡不确定性原则命名)是一种计算机错误,当试图研究它时,它会消失或改变其特征." ;-) (5认同)