N+1問題とは
10件の商品を一覧表示するWebページがあるという前提で
- 10件の一覧情報を取得(DBへのselectが1回実行される)
- 各商品の詳細情報を1件ずつ取得(DBへのselectが10回実行される)
- 1と2の情報を合わせて画面を表示
という実装がされていたとする。
このとき、「最初の手順で情報全部取ってきた方が効率的じゃない?」というのがN+1問題である。
10件というのは単なる例で、
N件だった場合、合計でN+1回のselectが発行されることからこの名前がついている。
解決策
一般的には1の手順でテーブルをjoinして、一括で情報を取得すると速度が向上する。
もしくは、詳細情報を別ページやモーダル表示にして「必要になったら改めて取得する」方法にすると良い。
補足
よくありがちなパフォーマンス問題の一種。
データの取得元がAPIで、「一覧取得API」と「詳細取得API」のように分かれている場合も
同じ現象に遭遇しやすい。
テスト時の少ないデータではパフォーマンスの遅さに気づきにくいのも特徴。