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じゃなくなり、非常に効果がありました。効果のほどは大きな声では言えませんが、数百倍ありました。。。
過去に一覧用のテーブルをバッチで定期的に更新して。。。とかやってましたが、サブクエリとは目からうろこでした。 結合をしているときにしか効かないので使う場面は限られますが、割と多くの一覧系処理で有効なのではないでしょうか?