37
24

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.

gem bulletを入れてみた(N+1問題に自分で気づけない人のために)

Last updated at Posted at 2021-01-05

何をしたか

Railsアプリを作っています。N+1問題について前々から関心はあったのですが、SQLについて学習が不足していることもあり、自分では気づけないことも多いので、N+1問題が発生している箇所があったら教えてくれるgem bulletを入れてみることにしました。

▶︎公式のドキュメントはこちら:bullet

導入方法

以下のコードをGemfileに記載します。

Gemfile
group :development do
  gem 'bullet'
end

bundle install後、以下のコマンドを実行します。

bundle exec rails g bullet:install

この時、テスト環境にもbulletを入れるかどうか聞かれると思いますが、公式のinstallのところにはdevelop環境へのインストールだけが記されていたのと、

公式のテスト環境へのインストールの記述を見てみても、なんだか色々大変そうだな(今回はそこまで時間をかける必要はない)だったので、今回は見送りました。

デフォルトで設定される内容

↑上記のコマンドで、config/environments/development.rbにデフォルトで以下の様なコードが追加されました。

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の設定可能な項目一覧は←こちらにありましたが、デフォルトで入っている項目について確認すると、

  • Bullet.enable...Bulletのgemを利用可能にします。でも、何もしません。
  • Bullet.alert...ブラウザにJSのアラートを出します。
  • Bullet.bullet_logger...bulletのログファイルを出します(場所:Rails.root/log/bullet.log)
  • Bullet.console...console.logに警告を出します。
  • Bullet.growl...Growlがインストールされているときに、ポップアップの警告を出します。
  • Bullet.rails_logger...railsのログに警告を出します。
  • Bullet.add_footer...画面左下にメッセージを出します。

...なるほどです。

実際の使用画面

実際に使用すると、こんな感じで警告が出ました。
n+1のコピー.png

直し方まで教えてくれていて便利ですね^^

未解決の問題

ところで、実際のテーブルはこんな感じで。。。。
Image from Gyazo

usersimagesの両方のテーブルに対して、N+1問題が発生していたので、この様に直し...。

#before
@posts = Post.order(created_at: 'DESC')

#after
@posts = Post.includes(:user, :images).order(created_at: 'DESC')

実際に、クエリは減りました。。。。

▼beforeの時
Image from Gyazo

▼afterの時
Image from Gyazo

countがいっぱい回っている、という別の問題があらわになりました:joy:

教えていただいて&調べてわかったのですが、これはまた別の問題のようで、こちらの方法で解決できました!

早くSQLに詳しくなってN+1問題も素早く発見&解決&未然に防止できる様になりたいです:relaxed:

37
24
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
37
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?