0

次のクエリは簡単です。

SELECT *
FROM   apple
       LEFT JOIN banana b1
              ON apple.id = b1.one
       LEFT JOIN banana b2
              ON apple.id = b2.two
WHERE  b1.id IS NULL
       AND b2.is IS NULL  

以下は遅いですが:

SELECT *
FROM   apple
       LEFT JOIN banana
              ON apple.id = banana.one
                  OR apple.id = banana.two
WHERE  banana.id IS NULL  

「or」を使用して「join on」ステートメントを実行すると、2 つのテーブルに対して結合するよりもはるかに遅い理由を誰か説明できますか?

4

3 に答える 3

5

joins での最初のクエリでは、mysql はbananaテーブルから 1 つの列のみを使用してルックアップします (N ルックアップ、N はappleテーブルからのレコードの nb です)。

2 番目のクエリでは、bananaテーブルの2 つの列を使用してルックアップを実行する必要がありますapple

使用されているアルゴリズムの詳細については、こちらをご覧ください。

また、 Stan McGeekが提供するこのフィドルEXPLAINで出力を確認することもできます

更新:また心に留めておいてください:

LEFT JOIN を使用して一部のテーブルに存在しない行を検索し、次のテストを行った場合: WHERE 部分で col_name IS NULL であり、col_name が NOT NULL として宣言された列である場合、MySQL はそれ以上の行の検索を停止します (特定のキーの組み合わせ) LEFT JOIN 条件に一致する 1 つの行が見つかった後。

于 2013-06-28T07:26:42.787 に答える