/ /複数の結合で 'on'条件を置く方が良いでしょうか? (mysql) - mysql、join、on-clause

複数の結合で 'on'条件を置く方がよい場合はどこですか? (mysql) - mysql、join、on-clause

私は、mysqlの左結合を含む複数の結合を持っています。これを行うには2つの方法があります。

  1. 私は各参加の直後に "ON"条件を置くことができます:

    選択*からA結合B ON(A.bid = B.ID)結合C ON(B.cid = C.ID)結合D ON(c.did = D.ID)

  2. 私はそれらを1つの "ON"節に入れることができます:

    選択* A結合B結合C結合D ON(A.bid = B.IDおよびB.cid = C.IDおよびc.did = D.ID)

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

私が必要ならば違うの? 左結合 または 右結合 私の質問で?

回答:

回答№1は5

簡単な使い方のために、MySQLは同じ方法でそれらをほとんど必然的に実行します。したがって、それは好みと読みやすさの仕方です(議論の大きなテーマです)。

しかし、より複雑なクエリでは、特に OUTER JOINディスクとioにバインドされる可能性がある - OUTER JOINクエリでWHERE句を使用しないと、パフォーマンスや目に見えない影響がある可能性があります。

8分または8秒間実行されるクエリの違い かもしれない 最終的には WHERE 特に、索引に関連する場合(MySQLがインデックスをどのように使用するか): WHERE クエリを実行するために必要な情報をクエリオプティマイザに提供し、クエリを最も効率的に実行する方法をエンジンに伝えることの中核部分です。

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

このセクションでは、次のような最適化について説明します。加工用に作られた WHERE句...テーブルを結合するための最適な結合の組み合わせは、次のとおりです。 すべての可能性を試すことによって見つけ出される。 ORDER BYのすべての列と GROUP BY句は同じテーブルから来ており、そのテーブルが優先されます 最初に参加するとき。

ジョインの各テーブルに対して、より簡単なWHEREが構築され、高速 テーブルのWHERE評価と、すぐに行をスキップする 可能

いくつかの例:

NOの全表スキャン(タイプ= ALL) Using where EXTRAで

[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 where,Using 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の両方が外部ジョインであるため(ここで徹底的にレビューしてください) デカルト積の問題が発生すると、テーブルスキャンの回避を避けなければならないので、クエリに必要でない行ができるだけ速く排除されます。

WHERE、インデックスとクエリオプティマイザを併用 かもしれない のような集合関数で慎重に使用されたとき、デカルト積がもたらす問題を完全に排除します。 AVERAGE, GROUP BY, SUM, DISTINCT ユーザによる適切な索引付けおよびWHERE句の利用によって、実行時間の減少の程度が達成される。

最後に

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


回答№2の場合は3

ON句を適用するJOINに入れます。

その理由は次のとおりです。

  • 読みやすさ:他の人が簡単にテーブルの結合方法を見ることができます
  • パフォーマンス:クエリの後半で条件を残すと、必要以上にジョインが発生します。つまり、where句に条件を入れること
  • 規約:通常のスタイルに従うことで、コードの移植性が向上し、珍しい構文で発生する可能性のある問題が発生しにくくなります。