MySQLのちょっとした裏技 MySQLはサブクエリーが遅い。 特にこういうのは行数が多くなるとはんぱなく遅い > select * from table1 where table1.t2id in (select id from table2) > EXPLAIN select * from table1 where table1.t2id in (select id from table2) で実行するとtable2が「DEPENDENT SUBQUERY(相関副問い合わせ)」 になってるのがわかる。 (select id from table2)がtable1の行数分だけ実行されるからこんな遅さ になっている。 そこでこちらの裏技をご紹介

使い方はSQLをちょっと書き換えるだけ > select * from table1 where table1.t2id in (select * from (select id from table2) t2) (select id from table2)をさらにselectするだけです。 これだけで(select id from table2)が何度も呼ばれることがなくなって かなり速くなります。 > select * from table1 where table1.id in (1,2) and table1.t2id in (select id from table2) > select * from table1 where table1.id in (1,2,3,4) and table1.t2id in (select id from table2) と > select * from table1 where table1.id in (1,2) and table1.t2id in (select * from (select id from table2) t2) > select * from table1 where table1.id in (1,2,3,4) and table1.t2id in (select * from (select id from table2) t2) を比べてみるとその速さの違いがわかると思います。