query-start
および query-done
プローブは、特定のクエリーがサーバーによって受け取られ、クエリーが実行され、情報がクライアントに正常に送信されたときにトリガーされます。
query-start(query, connectionid, database, user, host)
query-done(status)
-
query-start
: クライアントからクエリー文字列を受け取ったあとトリガーされます。引数は次のとおりです。query
: 送信されたクエリーの完全なテキスト。connectionid
: クエリーを送信したクライアントの接続 ID。この接続 ID は、クライアントが最初に接続したときに返される接続 ID と、SHOW PROCESSLIST
からの出力のId
値と同じです。database
: クエリーが実行されるデータベース名。user
: サーバーへの接続に使用されるユーザー名。host
: クライアントのホスト名。
query-done
: クエリーが実行されて、クライアントに情報が返されたときにトリガーされます。このプローブは単一の引数status
を格納し、クエリーが正常に実行されると 0 を返し、エラーが発生した場合は 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