クエリーキャッシュプローブは、いずれかのクエリーを実行するときに起動します。query-cache-hit
クエリーは、クエリーがクエリーキャッシュ内に存在するときにトリガーされ、クエリーキャッシュ情報を返すために使用できます。引数には、元のクエリーテキストおよびクエリーについてクエリーキャッシュから返される行数が格納されます。クエリーがクエリーキャッシュ内に存在しないか、クエリーキャッシュが使用可能でない場合、query-cache-miss
プローブが代わりにトリガーされます。
query-cache-hit(query, rows)
query-cache-miss(query)
query-cache-hit
: クエリーがクエリーキャッシュ内に見つかったときにトリガーされます。最初の引数query
にはクエリーの元のテキストが格納されます。2 番目の引数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