INNER JOINのFROMはサブクエリの方が高速?(MySQL)
2013年1月9日
スロークエリのログを見てたら、JOINしてる重いsqlを発見。
これは改善しなくては・・w
ざっくり書くとこんな感じのSQL。
SELECT h.* FROM hoge as h INNER JOIN foo AS f ON h.id = f.id WHERE h.name = 'a' AND f.name = 'b';
ま、いわいる普通のINNER JOIN。
WHEREの条件にはindexが貼ってあるし、indexを参照してるようですが、explainで見るとrowsがやけに多い。
件数を減らす為に、JOIN前に絞り込み(サブクエリ)
SELECT h.* FROM ( SELECT * FROM hoge WHERE name = 'a') AS h INNER JOIN foo AS f ON h.id = f.id WHERE f.name = 'b';
これで、そこそこ早くなりました。
indexの貼り方とかによっては、早くならない(逆に遅くなる)場合もあるかもしれませんがw