N+1問題を検出してくれるgem、bulletを導入する
Railsで作ったプロジェクトを開発環境で動かしていくと、ある一覧ページを表示する度にすごい量のSELECTが発行されているように見え、先輩に相談!
「N+1問題」というものを教えていただきました。
N+1問題 / Eager Loading とは - Rails Webook
解決策
以下のページを参考にしました。
ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い - Qiita
そもそもN+1問題はログを眺めていないと気づけないのでは…?と思ったところ、素敵なgemがあること先輩に教えていただきました!
それが「bullet」です。
GitHub - flyerhzm/bullet: help to kill N+1 queries and unused eager loading
導入手順
導入は下記ページを参考にしました。
» Railsライブラリ紹介: N+1問題を検出する「bullet」 TECHSCORE BLOG
Gemfileにbulletを追加
(開発環境でのみ使用する)
group :development do # Access an IRB console on exception pages or by using <%= console %> in views gem 'web-console', '~> 2.0' gem 'thin' gem 'rails_best_practices' gem 'bullet' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' end
bundleコマンドを実行し、gemをインストールする
$ bundle Fetching gem metadata from https://rubygems.org/........... Fetching version metadata from https://rubygems.org/... Fetching dependency metadata from https://rubygems.org/.. Resolving dependencies... Using rake 10.5.0 Using i18n 0.7.0 ・・・略・・・ Using sass-rails 5.0.4 Using web-console 2.3.0 Installing uniform_notifier 1.9.0 Installing bullet 5.0.0 Bundle complete! 15 Gemfile dependencies, 67 gems now installed. Bundled gems are installed into ./vendor/bundle.
開発環境のconfigにbullet用の設定を追加する
(config/environments/development.rbというファイルに下記の記述を追加する)
config.after_initialize do Bullet.enable = true Bullet.alert = true Bullet.bullet_logger = true Bullet.console = true Bullet.rails_logger = true end
railsサーバーを再起動する
(再起動しないとbulletが使えない)
再起動してN+1問題のクエリが発行されるページへアクセスすると、下記のようなポップアップが表示されるようになる
どこの処理で発生したかに加え対処方法をきちんと教えてくれるので、対処が簡単になりました(∩´∀`)∩ワーイ