#N + 1問題とは
N+1問題とは、データベースからデータを取り出す際に、大量のSQLが発行されてパフォーマンスが低下してしまう問題のことです。以前にN + 1問題について配信してありますので気になった方はご参照ください。
#bulletとは
N + 1問題がどこに発生しているかお知らせしてくれるgemです。
公式のドキュメント
#導入方法
以下のコードをGemfileに追記。
Gemfile
group :development do
gem 'bullet'
end
$ bundle install
#デフォルト設定
config/environments/development.rb
Rails.application.configure do
# ここから
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.bullet_logger = true
Bullet.console = true
# Bullet.growl = true デフォルトでコメントアウト
Bullet.rails_logger = true
Bullet.add_footer = true
end
# ここまでが追加。
end
(解説)
- Bullet.enable...Bulletのgemを利用可能
- Bullet.alert...ブラウザにJSのアラート表示
- Bullet.bullet_logger...bulletのログファイルを表示
- Bullet.console...console.logに警告
- Bullet.growl...Growlがインストールされているときに、ポップアップの警告を表示
- Bullet.rails_logger...railsのログに警告を表示
- Bullet.add_footer...画面左下にメッセージを表示
#N + 1問題検出
実際に使用すると、下記の感じで警告が表示。
ご丁寧に修正方法まで記載
表示の通りコントローラーにincludes[:user])に修正
#before
@chats = Chat.all
#after
@chats = Chat.includes(:user)
includesを指定することで関連をまとめて取得し、最小限のクエリ回数を減らせました。
#最後に
N+1問題に自分で気づけない人のために便利だと思いますが、やはり設計、開発でN+1問題が生じない為にもSQLに強くなる必要があると感じました。今回、SQLのクエリの画像を残すべきところを失念しており申し訳ございません