1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】bulletを使ってN + 1問題解決

Posted at

#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問題検出
実際に使用すると、下記の感じで警告が表示。
スクリーンショット 2021-09-12 14.11.17.png

ご丁寧に修正方法まで記載:grin:

表示の通りコントローラーにincludes[:user])に修正

#before
@chats = Chat.all

#after
@chats = Chat.includes(:user)

[Before]
スクリーンショット 2021-09-12 14.37.53.png

[After]
スクリーンショット 2021-09-12 14.57.30.png

includesを指定することで関連をまとめて取得し、最小限のクエリ回数を減らせました。

#最後に
N+1問題に自分で気づけない人のために便利だと思いますが、やはり設計、開発でN+1問題が生じない為にもSQLに強くなる必要があると感じました。今回、SQLのクエリの画像を残すべきところを失念しており申し訳ございません:bow:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?