##N+1問題
N+1 問題とは、Tree 状の情報を DB から読み出す際、全レコードの取得に一つ+各レコード分だけ SQL を発行してしまう問題のこと
余分なクエリを減らすために今回はN+1問題の検出とその対応について書いてく
N + 1問題の検出とその対応(検出編) 検出編はこちらから
##rack-mini-profiler
N+1問題が発生する場合と発生しない場合でどれだけクエリ数が違うのか見てみる
Gemfile
gem "rack-mini-profiler"
bundle installしてください
見たいページにアクセスして左上に出る数字をクリックすると
こんな感じで表示にかかる時間やクエリの数、詳細がみれる
上のがN+1問題に未対応の結果
##対応
実際に対応してみる
articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.all.includes(:user)
end
end
今回のN+1問題はviewでuserを呼び出してるのが原因なのでincludesでloadする
では、結果を見てみよう
前回インストールしたbulletがN+1問題を検出しなくなった
クエリ数を見てみると5分の1ぐらいに減った
##感想
見た感じだいぶクエリ数が減ったなあと思った
これからエンジニアになっていく上でこういうパフォーマンス的なところも意識できるようになっていきたい