やかんブログ

ORDER BYのチューニング

2009年06月17日(水)09:00|谷口

谷口です。

MySQLでORDER BYを付けると非常に実行時間がかかる。。。なんて経験があると思います。私もORDER BYに悩まされることが多いです。今回はORDER BYを伴うクエリのチューニングのうちの一つを紹介したいと思います。

その方法とは、サブクエリでソート済みのテーブルを作成して結合するという方法です。

たとえば、下記のようなSQL文があったとします。


SELECT 
  t1.col1, t2.col2
FROM 
  table1 t1,
  table2 t2
WHERE 
  t1.col1=t2.col1 AND t1.col2 = 1
ORDER BY t1.col1 DESC
LIMIT 10;

これを下記のように、t1をサブクエリでソートしてから結合する感じです。


SELECT 
  t1.col1, t2.col2
FROM 
  (SELECT * FROM table1 ORDER BY col1 DESC) t1,
  table2 t2
WHERE 
  t1.col1=t2.col1 AND t1.col2 = 1
LIMIT 10;

このチューニングが有効になるためには色々と条件がありますので、常に効果があるわけではないですが、私が試したクエリではusing filesortじゃなくなり、非常に効果がありました。効果のほどは大きな声では言えませんが、数百倍ありました。。。

過去に一覧用のテーブルをバッチで定期的に更新して。。。とかやってましたが、サブクエリとは目からうろこでした。 結合をしているときにしか効かないので使う場面は限られますが、割と多くの一覧系処理で有効なのではないでしょうか?

参考:漢(オトコ)のコンピュータ道: Using filesort

この記事に関するお問い合わせはこちら

ページの先頭へ