PDF (US Ltr)
- 26.8Mb
PDF (A4)
- 26.8Mb
ファイルソートプローブは、ファイルソート操作がテーブルに適用されるたびにトリガーされます。ファイルソートとそれが発生する条件について詳しくは、セクション8.2.1.15「ORDER BY の最適化」を参照してください。
filesort-start(database, table)
filesort-done(status, rows)
filesort-start
: テーブル上でファイルソート操作が開始したときにトリガーされます。プローブに対する 2 つの引数であるdatabase
およびtable
は、ソートされるテーブルを識別します。filesort-done
: ファイルソート操作が完了するとトリガーされます。2 つの引数が提供され、これらは、status
(成功の場合は 0、失敗の場合は 1)、およびファイルソート処理中にソートされた行数です。
次のスクリプトはこの例を示すもので、メインクエリーの期間に加えてファイルソート処理の期間を追跡します。
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("%-2s %-10s %-10s %9s %18s %-s \n",
"St", "Who", "DB", "ConnID", "Dur microsec", "Query");
}
mysql*:::query-start
{
self->query = copyinstr(arg0);
self->who = strjoin(copyinstr(arg3),strjoin("@",copyinstr(arg4)));
self->db = copyinstr(arg2);
self->connid = arg1;
self->querystart = timestamp;
self->filesort = 0;
self->fsdb = "";
self->fstable = "";
}
mysql*:::filesort-start
{
self->filesort = timestamp;
self->fsdb = copyinstr(arg0);
self->fstable = copyinstr(arg1);
}
mysql*:::filesort-done
{
this->elapsed = (timestamp - self->filesort) /1000;
printf("%2d %-10s %-10s %9d %18d Filesort on %s\n",
arg0, self->who, self->fsdb,
self->connid, this->elapsed, self->fstable);
}
mysql*:::query-done
{
this->elapsed = (timestamp - self->querystart) /1000;
printf("%2d %-10s %-10s %9d %18d %s\n",
arg0, self->who, self->db,
self->connid, this->elapsed, self->query);
}
ファイルソートをトリガーする ORDER BY
句を持つクエリーを大規模なテーブル上で実行し、次にテーブル上にインデックスを作成して同じクエリーを繰り返すことで、実行速度の違いを確認することができます。
St Who DB ConnID Dur microsec Query
0 @localhost test 14 11335469 Filesort on t1
0 @localhost test 14 11335787 select * from t1 order by i limit 100
0 @localhost test 14 466734378 create index t1a on t1 (i)
0 @localhost test 14 26472 select * from t1 order by i limit 100