5.8.1.4 查询解析探针

在解析原始 SQL 语句之前以及完成该语句的解析和确定处理该语句所需的执行模型时,将触发查询解析探针:

query-parse-start(query)
query-parse-done(status)
  • query-parse-start:在 MySQL 查询解析器解析该语句之前触发。单个参数query是一个字符串,其中包含原始查询的全文。

  • query-parse-done:原始语句的解析完成时触发。 status是描述操作状态的整数。 0table 示查询已成功解析。 1table 示查询解析失败。

例如,您可以使用以下 D 脚本监视解析给定查询的执行时间:

#!/usr/sbin/dtrace -s

#pragma D option quiet

mysql*:::query-parse-start
{
   self->parsestart = timestamp;
   self->parsequery = copyinstr(arg0);
}

mysql*:::query-parse-done
/arg0 == 0/
{
   printf("Parsing %s: %d microseconds\n", self->parsequery,((timestamp - self->parsestart)/1000));
}

mysql*:::query-parse-done
/arg0 != 0/
{
   printf("Error parsing %s: %d microseconds\n", self->parsequery,((timestamp - self->parsestart)/1000));
}

在上面的脚本中,在query-parse-done上使用了谓词,以便根据探测器的状态值生成不同的输出。

运行脚本并监视执行时:

shell> ./query-parsing.d
Error parsing select from t1 join (t2) on (t1.i = t2.i) order by t1.s,t1.i limit 10: 36 ms
Parsing select * from t1 join (t2) on (t1.i = t2.i) order by t1.s,t1.i limit 10: 176 ms