Open1
N+1問題について

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])