2012-04-17 10 views
0

INでのINNER JOINまたはINNER SELECTのどちらが速いのでしょうか?INでJOINまたはINNER SELECTを実行すると高速になりますか?

select t1.* from test1 t1 
inner join test2 t2 on t1.id = t2.id 
where t2.id = 'blah' 

OR

select t1.* from test1 t1 
where t1.id IN (select t2.id from test2 t2 where t2.id = 'blah') 
+1

実行してみましたか?または実行計画をチェックしましたか? – Taryn

+0

私はMySQLを使用しており、プロファイラの使用方法はわかりません。 –

+0

MySQLはクエリをレビューするためのEXPLAIN構文を持っていますhttp://dev.mysql.com/doc/refman/5.5/en/explain.html – Taryn

答えて

2

と仮定idは、これらのクエリは、同じことを意味し、まともなDBMSは、まったく同じ方法でそれらを実行します、キーです。残念ながらMySQLは、SQL Fiddleの "View Execution Plan"リンクを拡張することでわかるようにはありません。どちらが速くなるかは、おそらくテーブルのサイズに依存します。TABLE1の行数が非常に少ない場合、INは高速になる可能性がありますが、他のすべてのケースではJOINが高速になる可能性が高くなります。

これは、MySQLのクエリオプティマイザの特質です。私はOraclePostgreSQLまたはMS SQL Serverのような簡単な同等のクエリを別々に実行することはありませんでした。

0

あなたが問い合わせるしているものは何でもRDBSに実行計画をチェックする必要があると思いますけれども、私はinner joinを推測しますより速いか、少なくとも同じであろう。私が間違っていると、誰かが私を修正するだろう。

ネストされた選択は、おそらく、おそらく内部クエリ全体を実行し、可能な値のハッシュテーブルをtest2から構築します。このクエリで100万行が返された場合、何があってもそのデータをメモリに読み込むコストが発生しています。インナー付き

test1はわずか2行を持っている場合、それはおそらくちょうどそれらの行のそれぞれのid値に対するtest2に2回のインデックススキャンを行うと、メモリに百万行をロードする必要はありません、参加します。

さらに現代的なデータベースシステムでは、各テーブルに統計情報があるため、最初のシナリオを最適化できますが、最善のケースでは内部結合は同じになる可能性があります。

1

推測する必要がある場合、INNER JOININ (SELECT ...)より効率的ですが、クエリごとに異なる可能性があります。

EXPLAINはあなたの親友です。 SELECTクエリの前にEXPLAINと入力すると、MySQLはクエリの実行方法に関する基本情報を提供します。それは、あなたが作成したインデックスを使用している場所(そしてそれらを無視している場所)と、要求を満たすためにおそらく調べる必要がある行数をファイルソートを使ってどこに伝えます。

他のすべてが等しい場合は、INNER JOINを使用してください。これは、予測可能なので、新しい開発者が入ることを理解しやすくなるからです。IN (SELECT ...)フォームに本当の利点がある場合は、

0

ほとんどの場合、JOINはサブクエリよりもはるかに高速ですが、サブクエリはJOINよりも読みやすくなります。

RDBMSはJOINに対して実行計画を作成するので、処理するデータをロードする必要があると予測できます。これは間違いなく時間を節約します。一方、サブクエリでは、すべてのクエリを実行し、すべてのデータをロードして処理を行います。

For more details please check this link.

関連する問題