我们有很多疑问
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查询
由于应用程序不会像他们喜欢的那样神奇地生成查询,因此我认为很可能是应用程序中的某个地方出现了错误导致此问题.以下是您可以用来跟踪它的一些建议.我猜你使用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(或者你正在使用的任何东西)并拦截查询.