60

MySQL で複数のテーブルから選択する場合、次のクエリはどちらも同じ結果セットを返します。

これらのクエリの 1 つが他のクエリよりも優れているか、または効率的ですか? 小さなデータセット (各テーブルで約 2k 行) での私のテストでは、どちらもほぼ同じ実行時間で同じ結果セットを返します。

クエリ 1:

SELECT
    *
FROM
    products,
    product_meta,
    sales_rights
WHERE 
    (
        products.id = product_meta.product_id
        AND products.id = sales_rights.product_id
    )
    AND (...)
LIMIT 0,10;


クエリ 2:

SELECT
    *
FROM
    products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id 
WHERE
    (...)
LIMIT 0,10;
4

2 に答える 2

45

これらは同じですが、構文が異なります。したがって、2 つの構文間でパフォーマンスの違いを期待する必要はありません。ただし、最後の構文 (ANS SQL-92 構文) をお勧めします。詳細については、次を参照してください。

于 2012-11-20T15:06:33.187 に答える
4

このスレッドは素晴らしい説明を提供すると思います。

INNER JOIN は、使用すべき ANSI 構文です。

特に多くのテーブルを結合する場合は特に、読みやすいと一般的に考えられています。

また、必要に応じて OUTER JOIN に簡単に置き換えることもできます。

WHERE 構文は、よりリレーショナル モデル指向です。

結合された 2 つのテーブルの結果は、結合列が一致する行のみを選択するフィルターが適用されたテーブルのデカルト積です。

これは、WHERE 構文を使用すると簡単にわかります。

あなたの例では、MySQL (および一般的に SQL) では、これら 2 つのクエリは同義語です。

また、MySQL にも STRAIGHT_JOIN 句があることに注意してください。

この句を使用すると、JOIN の順序を制御できます。どのテーブルが外側のループでスキャンされ、どのテーブルが内側のループでスキャンされます。

WHERE 構文を使用して MySQL でこれを制御することはできません。

于 2012-11-20T15:09:26.363 に答える