sql >> データベース >  >> RDS >> Mysql

内部結合select(A、B)on A and B vs where(A、B)in select(A、B)in mysql

    これは、この質問に答えるのは簡単ではありません。重要なことを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はインデックスを使用します。パーティションについて言えば、実際に必要なものだけが使用されます。




    1. AmazonRDSポイントインタイムリカバリとClusterControlの比較

    2. MySQLSpatialCONTAINSが間違った結果を表示する

    3. Word、Excel、PowerPointでのキーボードのみのナビゲーションの使用(パート3:作業ウィンドウ)

    4. DockerはアプリケーションをMySQLに接続できません