読者です 読者をやめる 読者になる 読者になる

Using filesortにORDER BY NULL

スポンサーリンク

巨大なテーブルを結合し、テーブルをまたいだ複数キーでGROUP BYするSQLを書いてEXPLAINで実行計画を確認したところ、見たく無いものが出てしまいます。

Using temporary; Using filesort

テーブル結合自体はINDEXを使えているようですが(EXPLAINの結果から)、GROUP BYは、テーブルまたいてしまっているので、INDEXが使えていないのかな、、なので「Using temporary」はしょうが無いと思ったけれども、「Using filesort」が出るのが良くわかりません。
GROUP BYって、内部的にソートされるのが当然なのか!?って思ったけれども、どうもデフォルトの動作でGROUP BYの場合にソートが行われてしまう模様。

MySQL 4.1 リファレンスマニュアル :: 5.2.1 EXPLAIN 構文(SELECT に関する情報の取得)より

デフォルトでは、クエリで ORDER BY x,y[,...] と指定した場合と同様に MySQL によってすべての GROUP BY x,y[,...] クエリがソートされます。
ORDER BY 節を明示的に記述した場合、ソートは発生するものの、MySQL はスピードを損なうことなくそれを最適化します。
クエリに GROUP BY が含まれていて、もし結果のソートのオーバヘッドを回避したいならば、ORDER BY NULL を指定することでソートを抑止できます。 

INSERT INTO foo SELECT a,COUNT(*) FROM bar GROUP BY a ORDER BY NULL;

「ORDER BY NULL」を付与することにより、「Using filesort」は出なくなりました!
けど、実測取ってみたら、あまり速度的に変わらない(全体の1000分の1程度)のでちょっと残念。

確かに、パフォーマンスチューニングとして、「ORDER BY NULL」を付けるって記事はみかけないので、あまり効果無いものなのかもしれません。。
MySQLのパフォーマンスチューニングについて、一度しっかり勉強しておきたいと思っていて、いろんな人が下記の書籍をすすめているので、購入を検討中です。

実践ハイパフォーマンスMySQL

実践ハイパフォーマンスMySQL