MySQL分析器,它在运行时生成与“显示配置文件”相同的数据

时间:2013-11-23 08:59:40

标签: mysql profiling

因此,当我运行show profile for query N时,我会收到很多有用的信息,例如查询花费多长时间发送数据,释放资源等等。

不幸的是,show profile命令仅适用于命令提示符。这是一个问题,因为我有一些运行缓慢的查询,当我从命令提示符运行时,它们运行良好,但在实时场景中运行时效果不佳。

有谁知道如何从show profile获取相同类型的数据,但是在实时查询中从运行时获取数据?我已经阅读了有关使用常规查询日志的答案,但这是我想要的,因为一般日志只列出所做的查询,而不是他们在查询的每个阶段花了多少钱

1 个答案:

答案 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而且还需要一些信息如下。

  • SHOW PROCESSLIST
  • SHOW ENGINE INNODB STATUS
  • 显示全球状态
  • top输出