Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


5.4.1.12 ステートメントプローブ

個々のステートメントプローブは、さまざまなステートメントタイプについての固有の情報を付与するために提供されます。start プローブの場合、クエリーの文字列のみが引数として提供されます。ステートメントのタイプに応じて、対応する done プローブによって提供される情報は異なります。すべての done プローブについて、操作のステータス (成功の場合は 0、失敗の場合は >0) が提供されます。SELECTINSERTINSERT ... (SELECT FROM ...)DELETE、および DELETE FROM t1,t2 操作の場合、影響を受けた行数が返されます。

UPDATE および UPDATE t1,t2 ... ステートメントの場合、一致した行数と実際に変更された行数が提供されます。これは、対応する WHERE 句によって実際に一致した行数と、変更された行数が、異なる場合があるためです。値が新しい設定値とすでに一致している場合、MySQL では行の値は更新されません。

select-start(query)
select-done(status,rows)

insert-start(query)
insert-done(status,rows)

insert-select-start(query)
insert-select-done(status,rows)

update-start(query)
update-done(status,rowsmatched,rowschanged)

multi-update-start(query)
multi-update-done(status,rowsmatched,rowschanged)

delete-start(query)
delete-done(status,rows)

multi-delete-start(query)
multi-delete-done(status,rows)
  • select-start: SELECT ステートメントの前にトリガーされます。

  • select-done: SELECT ステートメントの終了時にトリガーされます。

  • insert-start: INSERT ステートメントの前にトリガーされます。

  • insert-done: INSERT ステートメントの終了時にトリガーされます。

  • insert-select-start: INSERT ... SELECT ステートメントの前にトリガーされます。

  • insert-select-done: INSERT ... SELECT ステートメントの終了時にトリガーされます。

  • update-start: UPDATE ステートメントの前にトリガーされます。

  • update-done: UPDATE ステートメントの終了時にトリガーされます。

  • multi-update-start: 複数テーブルを伴う UPDATE ステートメントの前にトリガーされます。

  • multi-update-done: 複数テーブルを伴う UPDATE ステートメントの終了時にトリガーされます。

  • delete-start: DELETE ステートメントの前にトリガーされます。

  • delete-done: DELETE ステートメントの終了時にトリガーされます。

  • multi-delete-start: 複数テーブルを伴う DELETE ステートメントの前にトリガーされます。

  • multi-delete-done: 複数テーブルを伴う DELETE ステートメントの終了時にトリガーされます。

ステートメントプローブの引数は次のとおりです。

  • query: クエリー文字列。

  • status: クエリーのステータス。成功の場合は 0、失敗の場合は >0

  • rows: ステートメントによって影響を受けた行数。これは SELECT について検出された行数、DELETE について削除された行数、および INSERT について正常に挿入された行数を返します。

  • rowsmatched: UPDATE 操作の WHERE 句によって一致した行数。

  • rowschanged: UPDATE 操作中に実際に変更された行数。

これらのプローブを使用して、ステートメントを実行するユーザーまたはクライアントをモニターすることなくこれらのステートメントタイプの実行をモニターします。この簡単な例は、実行時間を追跡することです。

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN
{
   printf("%-60s %-8s %-8s %-8s\n", "Query", "RowsU", "RowsM", "Dur (ms)");
}

mysql*:::update-start, mysql*:::insert-start,
mysql*:::delete-start, mysql*:::multi-delete-start,
mysql*:::multi-delete-done, mysql*:::select-start,
mysql*:::insert-select-start, mysql*:::multi-update-start
{
    self->query = copyinstr(arg0);
    self->querystart = timestamp;
}

mysql*:::insert-done, mysql*:::select-done,
mysql*:::delete-done, mysql*:::multi-delete-done, mysql*:::insert-select-done
/ self->querystart /
{
    this->elapsed = ((timestamp - self->querystart)/1000000);
    printf("%-60s %-8d %-8d %d\n",
           self->query,
           0,
           arg1,
           this->elapsed);
    self->querystart = 0;
}

mysql*:::update-done, mysql*:::multi-update-done
/ self->querystart /
{
    this->elapsed = ((timestamp - self->querystart)/1000000);
    printf("%-60s %-8d %-8d %d\n",
           self->query,
           arg1,
           arg2,
           this->elapsed);
    self->querystart = 0;
}

実行すると、基本的な実行時間と一致した行数を確認できます。

Query                                                        RowsU    RowsM    Dur (ms)
select * from t2                                             0        275      0
insert into t2 (select * from t2)                            0        275      9
update t2 set i=5 where i > 75                               110      110      8
update t2 set i=5 where i < 25                               254      134      12
delete from t2 where i < 5                                   0        0        0

別の方法として、DTrace の集計関数を使用して、個々のステートメントの実行時間を集計する方法があります。

#!/usr/sbin/dtrace -s

#pragma D option quiet


mysql*:::update-start, mysql*:::insert-start,
mysql*:::delete-start, mysql*:::multi-delete-start,
mysql*:::multi-delete-done, mysql*:::select-start,
mysql*:::insert-select-start, mysql*:::multi-update-start
{
    self->querystart = timestamp;
}

mysql*:::select-done
{
        @statements["select"] = sum(((timestamp - self->querystart)/1000000));
}

mysql*:::insert-done, mysql*:::insert-select-done
{
        @statements["insert"] = sum(((timestamp - self->querystart)/1000000));
}

mysql*:::update-done, mysql*:::multi-update-done
{
        @statements["update"] = sum(((timestamp - self->querystart)/1000000));
}

mysql*:::delete-done, mysql*:::multi-delete-done
{
        @statements["delete"] = sum(((timestamp - self->querystart)/1000000));
}

tick-30s
{
        printa(@statements);
}

前述のスクリプトは各操作の実行に費やした時間を集計し、これを使用すると標準的な一連のテストのベンチマークに役立つことがあります。

 delete                                                            0
  update                                                            0
  insert                                                           23
  select                                                         2484

  delete                                                            0
  update                                                            0
  insert                                                           39
  select                                                        10744

  delete                                                            0
  update                                                           26
  insert                                                           56
  select                                                        10944

  delete                                                            0
  update                                                           26
  insert                                                         2287
  select                                                        15985

User Comments
Sign Up Login You must be logged in to post a comment.