2011-01-22 13 views
6

this SQL questionへの回答では、固定値のIN()演算子が同じ内容のINNER JOINよりもはるかに遅いという声明が発生しました。値のテンポラリテーブルを作成し、それらにジョインしてください。それは本当ですか(一般に、MySQL、他のSQLエンジンを使用しています)、もしそうなら、なぜですか?直感的には、INのほうが速くなければなりません。潜在的な一致を、既にメモリー内にあり、必要な形式の固定値セットと比較しています。JOINでは索引を参照し、 INで必要とされない他の操作を実行します。私は何か重要なものを逃していますSQL固定値IN()とINNER JOINパフォーマンスの比較

this questionとは異なり、重複しているので、私はIN()のサブクエリではなく固定値のセットを持っていると言います。

+0

これは間違いなくDBプラットフォームによって異なります。 SQL ServerとPostgreSQLの私の経験では、インデックスに対する定数の 'IN'節は非常に高速です。 – Pointy

+0

リンク先の質問はSQL Serverです。あなたはすでに認識しているかどうかは分かりませんが、MySQLは[サブクエリでも]非常に壊滅的に悪いことがあります(http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower -than-in-sql/3417190#3417190) –

+0

@Martinオリジナルの質問(最初のリンク)はMySQLに関するものでした。私はサブクエリに関するMySQLのトラブルについて知っていますが、定数リストでは問題ないと思ったので、@ DVKの答えが私を驚かせました。 – StasM

答えて

7

これはIN節の長さに関係します。これは、MySQLではBUGと呼ばれることもあります。

MySQLは、複数のパーティション(IN項目ごとに1つ)を収集してマージする代わりに、TABLE/INDEX SCANにスワップするIN句のしきい値が低いようです。 INNER JOINをして

は、ほとんどの場合、

は、これらのMySQLのマニュアルページを参照してください、時には高速である理由であり、中にコレクションを登録しよ直接行ごとに使用するように強制され

IN (constant value list)がALWAなければならないことを意味しているようですので、私は間違っている可能性がysは各項目のバイナリ検索を使用します...

+1

一時テーブルに値を格納します。 – Pointy

+0

どのくらいの長さが悪くなるか考えてみましょうか? – StasM

+0

@StasM申し訳ありませんが、本当にわかりません。この動作は、MySQLのバージョンによっても異なる場合があります。 – RichardTheKiwi

関連する問題