##N+1問題
N+1 問題とは、Tree 状の情報を DB から読み出す際、全レコードの取得に一つ+各レコード分だけ SQL を発行してしまう問題のこと
余分なクエリを減らすために今回はN+1問題の検出とその対応について書いてく
N + 1問題の検出とその対応(対応編) 対応編はこちらから
##bullet
まずN+1問題を検出するgemを紹介する
このbulletというgemはアクセスしたページでN+1問題が検出された時にポップアップやログを残してくれる。
Gemfile
gem 'bullet'
Gemfileに書いたらbundle installしてください
config/environments/development.rb
config.after_initialize do
Bullet.enable = true # bullet を有効にする
Bullet.alert = true # ブラウザのJavaScriptアラート
Bullet.bullet_logger = false # Rails.root/log/bullet.log
Bullet.console = false # ブラウザの console.log の出力先
Bullet.rails_logger = false # Railsのログ
Bullet.add_footer = false # 画面の下部に表示
end
config/environments/development.rb に上記のような設定を書きます。
今回はjavascriptのアラートだけ有効にしてみました。
次にN+1問題が発生するように簡単なものを記述します。
articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end
index.html.haml
.row
.span16
%table.bordered-table.zebra-striped
%thead
%tr
%th id
%th userのメールアドレス
%th title
%tbody
- @articles.each do |ar|
%tr
%td= ar.id
%td= ar.user.email
%td= ar.title
この場合Viewでarticleからuserを呼び出すときに発生します。
実際にこのページにアクセスしてみると、、、
無事に検出されました。
##感想
bulletを使ってみると意外にN+1問題が発生してるところがあったりした
次回はN+1問題の対応編を書いていきたいと思う。