5.8.1.3 查询探针

当服务器接收到特定查询并且查询已完成并且信息已成功发送到 Client 端时,将触发query-startquery-done探针。

query-start(query, connectionid, database, user, host)
query-done(status)
  • query-start:从 Client 端收到查询字符串后触发。参数为:

  • query:提交的查询的全文。

    • connectionid:提交查询的 Client 端的连接 ID。连接 ID 等于 Client 端首次连接时返回的连接 ID 和SHOW PROCESSLIST的输出中的Id值。

    • database:要在其上执行查询的数据库名称。

    • user:用于连接服务器的用户名。

    • host:Client 端的主机名。

  • query-done:一旦执行查询并将信息返回给 Client 端,就会触发。该探针包括单个参数status,当成功执行查询时返回_2,如果发生错误则返回 1.

您可以使用以下 D 脚本获取每个查询的执行时间的简单报告:

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN
{
   printf("%-20s %-20s %-40s %-9s\n", "Who", "Database", "Query", "Time(ms)");
}

mysql*:::query-start
{
   self->query = copyinstr(arg0);
   self->connid = arg1;
   self->db    = copyinstr(arg2);
   self->who   = strjoin(copyinstr(arg3),strjoin("@",copyinstr(arg4)));
   self->querystart = timestamp;
}

mysql*:::query-done
{
   printf("%-20s %-20s %-40s %-9d\n",self->who,self->db,self->query,
          (timestamp - self->querystart) / 1000000);
}

在执行上述脚本时,您应该对查询的执行时间有基本的了解:

shell> ./query.d
Who                  Database             Query                                    Time(ms)
root@localhost       test                 select * from t1 order by i limit 10     0
root@localhost       test                 set global query_cache_size=0            0
root@localhost       test                 select * from t1 order by i limit 10     776
root@localhost       test                 select * from t1 order by i limit 10     773
root@localhost       test                 select * from t1 order by i desc limit 10 795