巨大なテーブルを結合し、テーブルをまたいだ複数キーで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のパフォーマンスチューニングについて、一度しっかり勉強しておきたいと思っていて、いろんな人が下記の書籍をすすめているので、購入を検討中です。
- 作者: ジェレミ・D.ザウドニ,デレク・J.ベリング,Jeremy D. Zawodny,Derek J. Balling,林秀幸
- 出版社/メーカー: オライリージャパン
- 発売日: 2004/10
- メディア: 単行本
- 購入: 9人 クリック: 239回
- この商品を含むブログ (53件) を見る