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.11 ファイルソートプローブ

ファイルソートプローブは、ファイルソート操作がテーブルに適用されるたびにトリガーされます。ファイルソートとそれが発生する条件について詳しくは、セクション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