Laravel

【Laravel】in、exists、joinの違い

Laravel

exists

  • 別テーブルの情報を抽出条件に使い、主テーブルの選択性が高い(絞り込み多)場合。
  • 評価順番:親問い合わせ → 副問い合わせ
  • 「主表フィルタの選択性が高い場合」、「主表側も従表側も選択性が低い場合」に使う。

join

  • 別テーブルの情報を出力対象にしたい場合に使う
    (別テーブルを抽出条件に使うだけの場合:existsinを使う)。
  • 「1:1」なら結果は同じだが、「1:N」の場合は結果が重複してしまう
    (※ distinct、groupByを使えば良いが、処理コストが高い)。

in、existsの違い

  • in:主問い合わせのwhereのに処理される。
    別テーブルの情報を抽出条件に使い、従テーブルの選択性が高い(絞り込み少)場合に使う。
  • exists:主問い合わせので処理される。
  • inに大量に重複データが含まれる場合はパフォーマンスが低下すると言われる
    → inは効率が悪いとも言われる。
    → inよりjoinを使う方が良いという意見もある。もしくは、inの中でdistinctを使う。
  • INはOR条件のようなものなので、1つでもレコードが見つかった時点で処理を終了するEXISTSの方が早いのが一般的。

自己結合

  • 同じテーブル同士を結合すること。
  • 結合する2テーブルの区別が付かないことでエラーになり得るので、テーブルに一時的な名前を付ける。