我们有很多疑问
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(使用前将#替换为@)