因此,当我运行show profile for query N
时,我会收到很多有用的信息,例如查询花费多长时间发送数据,释放资源等等。
不幸的是,show profile
命令仅适用于命令提示符。这是一个问题,因为我有一些运行缓慢的查询,当我从命令提示符运行时,它们运行良好,但在实时场景中运行时效果不佳。
有谁知道如何从show profile
获取相同类型的数据,但是在实时查询中从运行时获取数据?我已经阅读了有关使用常规查询日志的答案,但这是不我想要的,因为一般日志只列出所做的查询,而不是他们在查询的每个阶段花了多少钱
答案 0 :(得分:0)
我以前从未见过你想要的。但你可以自己完成你想要的。
开发程序监视慢速日志并立即重新运行慢速查询并打印show profile
输出。
我已经编写了PHP伪代码,我检查show profile
在PHP中运行良好。但是没有测试如何监视慢速日志和解析日志内容。下面只是伪代码。它不会工作。
$conn = mysql_connect("localhost", "user", "passwd");
monitor_slow_log($conn);
function monitor_slow_log($conn)
{
$res = mysql_query("set profiling = 1");
$fp = fopen("/path/to/slow_log", "r");
while (($str = fgets($fp, 10000)) !== false)
{
$query = parse_and_extract_query($str);
get_profile_result($str);
}
}
function parse_and_extract_query($str)
{
// I'm not sure how to parse it.
// as you know there are more than slow query.
}
function get_profile_result($query)
{
$res = mysql_query($query);
while ($row = mysql_fetch_array($res))
{
// fetch all record
}
mysql_free_result($res);
// print show profile result
$res = mysql_query("show profile");
while ($row = mysql_fetch_assoc($res))
{
echo $row["Status"]." ===> ".$row['Duration']."\n";
}
mysql_free_result($res);
// print SHOW PROCESSLIST
mysql_query("show processlist") and print
// print SHOW ENGINE INNODB STATUS
mysql_query("show engine innodb status") and print
// print SHOW GLOBAL STATUS
mysql_query("show global status") and print
// print `top` output
system('top -n 1');
}
此外,不仅show profile
而且还需要一些信息如下。
top
输出