web-dev-qa-db-ja.com

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

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

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

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

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

Visual explanation of JOIN types

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

つまり、本当にLEFT JOINを意味する場合は、INNER JOINを使用しないでください。

MySQLでは、CROSS JOININNER JOINおよびJOINは同じです。標準では、意味的には、CROSS JOININNER JOINであり、ON句がないため、テーブル間の行のすべての組み合わせを取得できます。

Wikipediaの結合のすべてのセマンティックタイプの例 があります。実際には、MySQLではJOINLEFT JOINのみを記述する傾向があります。

14
jynus

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

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

たとえば、JOINLEFT JOIN + WHERE句でフィルタリングすると、同じことになります。 最適化vs人間による読み取りは、多くの結合を持つ大規模なクエリで意味があります。

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

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

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

0
Shim-Sao