IT-Q

そもそも N+1 では、何がどう起きているのですか。

発行されるクエリ数が件数に比例するからです。開発環境の10件では体感できず、本番の数千件で急に落ちます。「ローカルでは速かった」の典型が、この 1+N 本という構造です。

面接官が見ているのは用語は知っているが中身を説明できない層の補強。

これは「一覧ページの表示が重いと報告されました。Eloquent を使っています。最初に何をしますか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • 一覧1本+各行につき1本で合計 1+N 本になり、件数に比例して遅くなる
    その通りです。エラーが出ないので開発環境の10件では気づかず、本番の数千件で落ちるのが厄介な点です。
  • 1本のクエリが N 倍遅くなる
    本数の問題であって、1本あたりの速度の問題ではありません。
  • N 件のレコードが重複して取得される
    重複は起きません。取得結果は正しく、遅いだけです。
  • リレーション先のテーブルが毎回ロックされる
    ロックとは無関係です。単純な SELECT が繰り返されているだけです。

面接官は何を見ているか

  • 一覧1本+各行につき1本、で合計 1+N 本になると説明できた
  • 件数に比例して遅くなる(10件では気づかず1000件で死ぬ)と言えた
  • ローカルで気づきにくい理由を説明できた

模範解答

一覧を取るクエリが1本、そのあとループの中で各行のリレーションを引くクエリがN本、合わせて 1+N 本発行される状態です。問題は件数に比例することで、開発環境の10件では体感できず、本番の数千件で突然落ちます。「ローカルでは速かった」の典型的な原因がこれです。