これは、この質問に答えるのは簡単ではありません。重要なことを1つ知っておく必要があります。MySQLはIN (<static values list>)
を処理します およびIN (<subquery>)
さまざまなクエリ
として 。最初のものは範囲比較に等しい (.. OR = .. OR =
のように )2番目は= ANY ()
に等しい -そしてそれは同じではありません。つまり、簡単に言うと、IN
を使用する サブクエリを使用すると、ANY()
を使用してクエリが発生します また、MySQLは、サブクエリが独立していて静的な値のリストを返す場合でも、そのためのインデックスを使用しません。 。悲しいけれど事実です。 MySQLはそれを予測できないため、明らかな場合でもインデックスは使用されません。 JOIN
を使用する場合 (つまり、IN (<subquery>)
を書き直します )-その後、MySQLはJOIN
のインデックスを使用します 可能であれば、状態。
さて、2番目のケースはJOIN
についてかもしれません およびIN
パーティションを使用する場合。 JOIN
を使用する場合 -それでは悲しいことに-しかしMySQLはJOIN
のパーティションを予測することもできません 一般的な場合-そしてそれはそれのためにパーティションのセット全体を使用します。 JOIN
の置き換え IN (<static list>)
へ EXPLAIN PARTITION
を変更します 写真:MySQLは、IN
内で指定された範囲から値を選択するために必要なパーティションのみを使用します 句。ただし、これもIN (<subquery>)
では機能しません。 。
結論として、MySQLがIN
をどのように処理しているかについて話していると、悲しいことです。 サブクエリ-通常、JOIN
に置き換えることはできません 安全に(それはパーティション分割の場合についてです)。したがって、一般的な解決策は次のようになります。アプリケーションレベルでメインクエリからサブクエリを分離する 。独立したサブクエリについて言っている場合、静的な値のリストを返すのが最善の提案です-その場合、その値のリストをIN (<static list>)
として置き換えることができます メリットが得られます。MySQLはインデックスを使用します。パーティションについて言えば、実際に必要なものだけが使用されます。