4

mysql に左結合を含む複数の結合があります。これには 2 つの方法があります。

  1. 各参加の直後に「ON」条件を設定できます。

    select * from A join B ON(A.bid=B.ID) join C ON(B.cid=C.ID) join D ON(c.did=D.ID)

  2. それらすべてを 1 つの「ON」句に入れることができます。

    select * from A join B join C join D ON(A.bid=B.ID AND B.cid=C.ID AND c.did=D.ID)

どちらの方法が良いですか?

クエリで左結合または右結合が必要な場合は異なりますか?

4

2 に答える 2

6

単純な用途では、MySQL はほぼ必然的に同じ方法でそれらを実行するため、これは好みと読みやすさの方法です (これは大きな議論の対象です)。

ただし、より複雑なクエリ、特にOUTER JOINディスクと io バウンドになる可能性のある s を含む集計クエリでは、OUTER JOIN クエリで WHERE 句を使用しないと、パフォーマンスと目に見えない影響が生じる可能性があります。

8 分間または 0.8 秒間実行されるクエリの違いは、特にインデックスに関連するため、最終的には句に依存する可能性があります ( MySQL がインデックスを使用する方法):句は、クエリ オプティマイザに必要な情報を提供するためのコア部分です。ジョブを実行し、最も効率的な方法でクエリを実行する方法をエンジンに伝えます。WHEREWHERE

MySQL が WHERE を使用してクエリを最適化する方法から:

「このセクションでは、WHERE 句を処理するために行うことができる最適化について説明します...テーブルを結合するための最適な結合の組み合わせは、すべての可能性を試すことによって見つけられます。ORDER BY 句と GROUP BY 句のすべての列が同じテーブルに由来する場合、そのテーブルは入会時に優先します。」

結合内のテーブルごとに、より単純な WHERE が構築され、テーブルの WHERE 評価が高速になり、行ができるだけ早くスキップされます。

いくつかの例:

Using whereEXTRAに NO を指定したフル テーブル スキャン (タイプ = ALL)

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id AND cr.role = cr2.role AND cr.util = 1000

[Err] Out of memory

インデックス ( , )を使用whereして結果を最適化するためにUsing whereUsing index使用します。

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id 
WHERE cr.role = cr2.role 
AND cr.util = 1000

515661 rows in set (0.124s)

**** ON/WHERE の組み合わせ - 同じ結果 - 同じ計画EXPLAIN*******

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id 
AND cr.role = cr2.role
WHERE cr.util = 1000

515661 rows in set (0.121s)

通常、MySQL は上記のような単純なクエリを見つけ出し、同様に実行しますが、そうでない場合もあります。

外部結合クエリのパフォーマンス:

LEFT JOIN と RIGHT JOIN の両方が OUTER JOINSであるため (詳細なレビューはこちら)、デカルト積の問題が発生するため、テーブル スキャンの回避を回避して、クエリに不要な行をできるだけ多く削除する必要があります。できるだけ。

WHERE、インデックスとクエリ オプティマイザを一緒に使用すると、、、などの集約関数を注意深く使用すると、デカルト積によって生じる問題を完全に解消できます。ユーザーによる適切なインデックス作成と WHERE の利用によって、実行時間の大幅な短縮が達成されます。句。AVERAGEGROUP BYSUMDISTINCT

ついに

繰り返しになりますが、大部分のクエリでは、クエリ オプティマイザはこれらを同じ方法で実行します。これは好みの方法ですが、クエリの最適化が重要になる場合WHERE、非常に重要なツールになります。INNER JOINインデックス付きの列を追加の ON..AND ON 句として指定すると、特定のケースでパフォーマンスが向上することがわかりましたが、その理由はわかりませんでした。

于 2013-08-11T05:39:00.320 に答える