2

我们有一个大型 php 应用程序并尝试调试慢速 sql 查询,我们希望能够自动注释实际调用 sql 查询的文件,例如:

"select /* filename.php line 234*/ `ID`,`Email`, `NickName`, `AlertBusiness`,`City` from People where ?=? and limit ?,?"

/* filename.php line 234*/ 是动态插入的。大概

在php中有一个debug_backtrace,http ://php.net/manual/en/function.debug-print-backtrace.php

哪个可以手动完成:

<?php

$query = sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')",
    mysql_real_escape_string(join("\n", debug_backtrace())) );
mysql_query($query);

?>

但希望有一些更核心的东西,比如数据库驱动程序。

MediaWiki 也有类似的功能。 http://www.mediawiki.org/wiki/Manual:How_to_debug

You can also enable backtrace on SQL error by setting $wgShowDBErrorBacktrace:

$wgShowDBErrorBacktrace = true;"

PDO 驱动程序有一个转储语句,但这只是查询,而不是谁调用它 http://php.net/manual/en/pdostatement.debugdumpparams.php

您如何在运行它的 php 页面的上下文中最好地调试 sql?

4

1 回答 1

0

这可能太简单了,但是您可以在 MySQL 中打开慢查询日志并找到前 10-25 个慢查询。

获得慢查询列表后,您可以使用Percona Toolkit来分析它们。

我会使用ack/ack-grep来查找罪魁祸首及其所在的位置。如果您有大量文件直接调用 MySQL,那么通过将 MySQL 注释附加/附加到查询的方法进入并路由它们将是痛苦的,并且可能不是最有效的。

如果您有多个应用程序连接到同一个数据库,最好也将用户分开,这样您就可以确定哪些用户/应用程序正在占用数据库资源。

于 2014-08-20T16:23:40.703 回答