Rails Diary

プログラミングの学習記録です。

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_nameuser情報が必要になるため、ユーザーの数が多ければ多いほど、クエリの量が増えパフォーマンスに影響するということ。

【下記は参考のため実際のデータとは異なる】 f:id:okmt_Aya_26:20220117210046p:plain ↑このような形でuserを取得するため、たくさんのクエリが発行されている。

解決方法:includesメソッド

includes | Railsドキュメント

関連するテーブルをまとめて取得するメソッド

def index
  @posts = Post.all.includes(:user).order(created_at: :desc)
end

【下記画像も参考ため実際のデータとは異なる】 f:id:okmt_Aya_26:20220117212742p:plain ↑includesメソッドの使用でクエリの数が減っている

参考にしたサイト

【Rails】パフォーマンス低下に繋がるN+1問題とは?解決策と併せて解説!|TechTechMedia