それらすべてが同じ結果を提供する場合、どの結合がより良いパフォーマンスを発揮しますか?たとえば、2つのテーブルemployees(emp_id,name, address, designation, age, sex)
とwork_log(emp_id,date,hours_wored)
があります。両方の特定の結果を取得するにはinner join
およびleft join
も同じ結果になります。しかし、私はまだこの疑問だけに限定されないいくつかの疑問を抱えています。
「良い」または「悪い」結合タイプはありません。それらは異なる意味を持ち、それに応じて使用する必要があります。
あなたのケースでは、おそらくwork_log(テーブルに行がない)の従業員がいないため、結果ではLEFT JOIN
とJOIN
は同等になります。ただし、そのようなもの(work_logが登録されていない新しい従業員)がある場合、JOIN
はその従業員を省略しますが、左結合(最初のテーブルは従業員)はすべてを表示し、一致しない場合は、work_logのフィールド。
繰り返しになりますが、パフォーマンスはクエリの正確性にとって二次的なものです。 LEFT JOIN
sを使うべきではないと言う人もいます。 LEFT JOINがオプティマイザに特定の順序でクエリを実行するように強制し、場合によっては一部の最適化(テーブルの並べ替え)を妨げることは事実です。 ここに1つの例があります 。しかし、INNER JOINは本質的に悪くないので、正確さ/意味が犠牲になる場合は、どちらか一方を選択するべきではありません。残りの通常の最適化は通常どおり適用されます。
つまり、本当にLEFT JOIN
を意味する場合は、INNER JOIN
を使用しないでください。
MySQLでは、CROSS JOIN
、INNER JOIN
およびJOIN
は同じです。標準では、意味的には、CROSS JOIN
はINNER JOIN
であり、ON
句がないため、テーブル間の行のすべての組み合わせを取得できます。
Wikipediaの結合のすべてのセマンティックタイプの例 があります。実際には、MySQLではJOIN
とLEFT JOIN
のみを記述する傾向があります。
それらのすべてが同じ結果を提供する場合、どちらの結合のパフォーマンスが向上しますか?
以前の回答に加えて、MySQLは同じパフォーマンスを持つように最適化されています。
たとえば、JOIN
とLEFT JOIN
+ WHERE
句でフィルタリングすると、同じことになります。 最適化vs人間による読み取りは、多くの結合を持つ大規模なクエリで意味があります。
適切なインデックスとキャッシュを使用することがより重要です。
あなたはここで最適化プロセスの良い説明を読むことができます:
クエリ最適化プロセス :多くの場合、クエリはさまざまな方法で実行でき、同じ結果が得られます。オプティマイザの仕事は、最適なオプションを見つけることです。