Open1

N+1問題について

3210mo3210mo

gem "bullet"

N+1が発生している場合アラート表示してくれるgem

解消法はeager loading(一括読込み)すること

includes ,preload,eager load

方法 クエリ発行方法 利用する場面 メリット デメリット
includes Railsが状況に応じて最適化(複数クエリ or JOIN) 一般的なN+1問題解消に最適 クエリの最適化をRailsに任せられる 複雑なクエリでは意図しない動作も
preload 必ず複数クエリ 結合が不要な場合、関連テーブルを効率的にロードしたい場合 複数クエリでパフォーマンスが良い場合 JOINが使えず、フィルタリングできない
eager_load 必ずLEFT OUTER JOINを使用 結合して一度にデータを取得し、フィルタリングやソートを行いたい場合 1つのクエリで結合し、柔軟に操作可能 データ量が多いとメモリ負荷が大きい

記述方法

関連付け

books = Book.includes(:author).limit(10)

ネストした関連付け(1つ)

@user_customers = @customer.user_customers.includes(user: :user_detail)

ネストした関連付け(複数)

@user_customers = @customer.user_customers.includes(user: [:user_detail, :profile])