Ruby on RailsのActive Recordのクエリ改善を行うためのGem「Bullet」を紹介します。
Bulletは開発環境でN+1のクエリを見つけたら警告を出してくれるgemです。
N+1問題とはデータ量(N+1)回のクエリを実行してしまい、レスポンスが悪くなる問題です。
🍮 インストール手順
Gemfileに以下を追加して、bundle install
を実行します。
group :development do |
config/environments/development.rb
に次の設定を追加します。
AppName::Application.configure do |
🍣 N+1問題の解消方法
N+1の警告が発生するようなクエリを見つけたらinclude
でSQLの実行時に合わせて関連テーブルを読み込みます。
def index |
修正前はArticlesのレコード分読み込んでいました。
Started GET "/articles" for 127.0.0.1 at 2017-05-12 19:59:04 +0900 |
修正後は2つのSQLクエリで完了していることがわかります。
Started GET "/articles" for 127.0.0.1 at 2017-05-12 20:03:07 +0900 |
😀 Bulletのホワイトリスト設定
Bulletを使っている中でN+1の警告を無視したい場合はホワイトリスト形式でconfig/initializer/bullet.rb
に登録しておきましょう。
# N+1クエリが発生しても警告を出さない |
🐡 補足:Ruby/Railsのバージョン情報
本件の動作検証の環境は次のとおりです。
- Ruby 2.4.1
- Rails 5.1.0
- Bullet 5.5.1