MySQL:左外部結合と内部結合のどちらが良い結合か


10

それらすべてが同じ結果を提供する場合、どの結合がより良いパフォーマンスを発揮しますか?たとえば、2つのテーブルemployees(emp_id,name, address, designation, age, sex)とがありwork_log(emp_id,date,hours_wored)ます。いくつかの具体的な結果を得るために、両方のinner joinleft join同じ結果になります。しかし、私はまだこの疑問だけに限定されない疑問をいくつか抱えています。

  • 同じ結合の場合、同じ結果値の場合にどちらが優先されるのでしょうか。
  • 結合を適用するときに考慮しなければならない他の要素は何ですか?
  • 内部結合とクロス結合の間に関係はありますか?

回答:


14

「良い」または「悪い」結合タイプはありません。それらは異なる意味を持ち、それに応じて使用する必要があります。

あなたのケースでは、あなたはおそらくノーwork_log(そのテーブルに行)を持つ従業員を持っていないので、LEFT JOINJOINの結果に等しくなります。ただし、そのようなものがあった場合(work_logが登録されていない新しい従業員)、JOINその従業員は省略されますが、左結合(最初のテーブルは従業員)はすべてを表示し、存在する場合はwork_logのフィールドにnullを表示します一致しません。

JOINタイプの視覚的説明

繰り返しになりますが、パフォーマンスはクエリの正確性にとって二次的なものです。LEFT JOINs を使うべきではないと言う人もいます。LEFT JOINがオプティマイザに特定の順序でクエリを実行することを強制し、場合によっては一部の最適化(テーブルの並べ替え)を妨げることは事実です。一例を示します。しかし、INNER JOINは本質的に悪くないので、正確性/意味が犠牲になる場合は、どちらか一方を選択しないでください。残りの通常の最適化は通常どおり適用されます。

要約すると、LEFT JOIN本当に意味がある場合は使用しないでくださいINNER JOIN

MySQLではCROSS JOININNER JOINJOIN同じです。標準では、意味的には、a CROSS JOINは句INNER JOINなしなONので、テーブル間の行のすべての組み合わせを取得します。

あなたは持っているウィキペディアに参加するすべてのセマンティックタイプの例を。実際には、MySQLでは、とのみを記述する傾向がJOINありLEFT JOINます。


1
Gr8説明@jynus。幸いなことに、私はこれらの質問に対する回答をあなただけから得ました。
ursitesion 2014

1つの関連グラフィックは1000語より優れています。あなたはそれを作りましたか?
Fr0zenFyr 2017

いいえ、私はしませんでした、帰属は画像の下部にありますcodeproject.com/Articles/33052/…-結合を表すためにベン図を使用するのは代数的形式化と同じくらい古いです:en.wikipedia.org/wiki/Relational_algebra
ジヌス

私は一連のコメントから始めて、それがすべてに要約されることに気づきました-それはあなたのクエリに依存します。私からの+1!
iheanyi 2017


0

それらすべてが同じ結果を提供する場合、どの結合の方がパフォーマンスが優れていますか?

以前の回答に加えて、MySQLは同じパフォーマンスを持つように最適化されています。

優れたインデックスを使用すると、たとえば、フィルタリングするJOINvs LEFT JOIN+ WHERE句は同じことになります。最適化人間による読み取りは、結合が多い大規模なクエリで有効です。

適切なインデックスとキャッシュを使用することがより重要です。

あなたはここで最適化プロセスの良い説明を読むことができます:

クエリの最適化プロセス多くの場合、クエリはさまざまな方法で実行され、同じ結果を生成します。オプティマイザの仕事は、最良のオプションを見つけることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.