経緯

N+1問題が発生しないようにプログラムを書いているはずだけど、どこかで起きてしまっていそうで不安。。。

ということがあって、何か判定してくれるGemないかなーと思ってたら、案の定あったので、ご紹介。

N+1問題とは

そもそもN+1問題って何?って人のために。

例えば、Articleに紐づくUserというものがあったとします。Article一覧を出しつつ、著者の名前も表示したいというとき、単純にかくと、以下のようになります。

ただ、ここでログを見ていると、

のあとに

みたいなものが大量に吐かれます。

最初、記事一件を取得するために1クエリが走って、そのあと、N件あれば、Nクエリ走ってしまうことから「N+1問題」と呼ばれています。

これを放置しておくと、100万件とかになったとき、パフォーマンスに影響してしまいます。

Bullet

https://github.com/flyerhzm/bullet

いつものようにGemfileの中にgem 'bullet', group: :developmentと書いて、bundle install --path vendor/bundleを実行してやりましょう。

あとは、普通にWebサーバーを起動するだけ。http://example.com/articles/にアクセスすると、「N+1問題が発生してるよ!」とJSのアラートが表示されます。

まとめ

パフォーマンスに運用上、影響しないところでも、パッとできることで、修正できるなら、直しておいてあげたほうがプロダクトとしては健全ですよね。