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

mysqlに最初にサブクエリを実行させることはできますか?

    SELECT  `table_1`.*
    FROM    `table_1`
    INNER JOIN
            `table_2` [...]
    INNER JOIN
            `table_3` [...]
    WHERE   `table_1`.`id` IN
            (
            SELECT  `id`
            FROM    [...]
            )
            AND [more conditions]
    

    内部テーブルに適切なインデックスが付けられている場合、ここでのサブクエリは厳密な意味で「実行」されていません。

    サブクエリはINの一部であるため 式の場合、条件はサブクエリにプッシュされ、EXISTSに変換されます。 。

    実際、このサブクエリは各ステップで評価されます:

    EXISTS
    (
    SELECT  NULL
    FROM    [...]
    WHERE   id = table1.id
    )
    

    EXPLAIN EXTENDEDが提供する詳細な説明で実際に確認できます。 。

    そのため、DEPENDENT SUBQUERYと呼ばれています。 :各評価の結果は、table1.idの値によって異なります。 。サブクエリ自体は相関していません。相関しているのは最適化されたバージョンです。

    MySQL 常にEXISTSを評価します より単純なフィルターの後の句(評価がはるかに簡単で、サブクエリがまったく評価されない可能性があるため)

    サブクエリを一度に評価する場合は、クエリを次のように書き直します。

    SELECT  table_1.*
    FROM    (
            SELECT  DISTINCT id
            FROM    [...]
            ) q
    JOIN    table_1
    ON      table_1.id = q.id
    JOIN    table_2
    ON      [...]
    JOIN    table_3
    ON      [...]
    WHERE   [more conditions]
    

    これにより、サブクエリが結合の先頭になります。これは、サブクエリがtable_1と比較して小さい場合に効率的です。 、サブクエリがtable_1と比較して大きい場合は、効率が低下します 。

    [...].idにインデックスがある場合 サブクエリで使用されるサブクエリは、INDEX FOR GROUP-BYを使用して実行されます 。



    1. 2つの日付の間の月数を調べる

    2. エラー3706プロバイダーが見つかりません。正しくインストールされていない可能性があります

    3. WHERE句またはON句のINNERJOIN条件?

    4. テーブルをマスクして参照整合性を維持する方法