5.8.1.5 查询缓存探针

执行任何查询时都会触发查询缓存探针。当查询高速缓存中存在查询时,将触发query-cache-hit查询,该查询可用于返回查询高速缓存信息。参数包含原始查询文本以及从查询的查询缓存返回的查询行数。如果查询不在查询缓存中,或者未启用查询缓存,则将触发query-cache-miss探针。

query-cache-hit(query, rows)
query-cache-miss(query)
  • query-cache-hit:在查询缓存中找到查询时触发。第一个参数query包含查询的原始文本。第二个参数rows是一个整数,其中包含缓存的查询中的行数。

  • query-cache-miss:在查询缓存中找不到查询时触发。第一个参数query包含查询的原始文本。

最好将查询缓存探针与主查询上的探针结合使用,以便您可以确定对指定查询使用或不使用查询缓存之间的时间差异。例如,在以下 D 脚本中,查询和查询缓存信息在监视期间被组合到信息输出中:

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN
{
   printf("%-20s %-20s %-40s %2s %-9s\n", "Who", "Database", "Query", "QC", "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;
   self->qc = 0;
}

mysql*:::query-cache-hit
{
   self->qc = 1;
}

mysql*:::query-cache-miss
{
   self->qc = 0;
}

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

执行脚本时,您可以看到查询缓存的效果。最初,查询缓存被禁用。如果您设置查询缓存大小,然后多次执行查询,则应该看到查询缓存用于返回查询数据:

shell> ./query-cache.d
root@localhost       test                 select * from t1 order by i limit 10     N  1072
root@localhost                            set global query_cache_size=262144       N  0
root@localhost       test                 select * from t1 order by i limit 10     N  781
root@localhost       test                 select * from t1 order by i limit 10     Y  0