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)
を比べてみるとその速さの違いがわかると思います。