not inの代わりにLeft joinを巧みに使う

1916 ワード

多くの人は各種データベースの中でnot inの効率が極めて低いことを知っている.たとえば
select * from a
where a.id not in (
     select id from b
)

私たちがa表に10万件の記録があり、b表にも10万件の記録がある場合、必要な判断は10万に10万を乗じた100億回の判断である.従って、実行効率が極めて低い.存在を発見しても戻る.100億/2=50億回の判断もある.
この場合、Left joinで判断できるのはずっと速いです.
select a.* from a
left join b
     on a.id=b.id
where b.id is null

私はこの文がみんなが知っていると信じています.相対的に.ここでは10万のデータ接続を行い、それから10万回の判断をすればよい.全部で20万回しかありません.10万のデータ接続にとって、速度は速い.
100億/20万相差5万倍速度.50億/20万相差2.5万倍速度.
これに対して、aテーブルのデータが多ければ多いほど、抽出が速くなる.
もちろん私のこの上の関连するのはaで、b表の中ですべて缲り返すIDがなくて、もし缲り返すIDに関连するならば.exceptなどの字を通じて(通って)フィルタリングすることができます.接続速度を向上する.distinctとleft joinの間の効率はあなたの経験で判断する必要があります.