N+1問題とは
N+1問題とは
SQLが必要以上に実行されることでパフォーマンスが落ちる問題。モデル間のアソシエーションを利用する場合に発生する。
例)投稿テーブルとユーザーテーブルを関連付けている
ビューで投稿一覧とユーザーを一緒に表示したい。
未対策の場合、投稿一覧を取得した後にユーザー情報を一つ一つ取ってくる必要があるので、SQLがユーザーの数だけ発行されてパフォーマンスが下がってしまう。
この問題をincludesメソッド
で対策し、投稿をユーザーをまとめて取ってくることで、SQLの数を減らしてパフォーマス低下を防ごう!というもの。
未対策の場合に起こること
def index @posts = Post.all.order(created_at: :desc) end
↑ユーザーに紐付いた投稿を全て取得する処理。
<%= post.user.decorate.full_name%>
↑ビュー内のpost.user.decorate.full_name
でuser
情報が必要になるため、ユーザーの数が多ければ多いほど、クエリの量が増えパフォーマンスに影響するということ。
【下記は参考のため実際のデータとは異なる】 ↑このような形でuserを取得するため、たくさんのクエリが発行されている。
解決方法:includesメソッド
関連するテーブルをまとめて取得するメソッド
def index @posts = Post.all.includes(:user).order(created_at: :desc) end
【下記画像も参考ため実際のデータとは異なる】 ↑includesメソッドの使用でクエリの数が減っている