概要
N+1問題の説明と対応についてまとめる。
N+1問題とは
- 全てのレコードの取得に1個+レコード文だけのN個のSQLを発行してしまう問題
- N+1というより1+Nと解釈したほうがわかりやすい
例
- 一覧表示用のデータを取得するケース
- 一覧用の全データを取得するSELECTを1回発行(Nレコード返ってくる)
- Nレコードの関連データ取得のためにSELECTをN回発行
対応
- join
SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "posts"."id" = 1"- Eager Loading
SELECT "users".* FROM "users"SELECT "posts".* FROM "posts" WHERE "posts"."id" IN (1, 2, 3, 4, 5)