RailsでN+1問題を解決するには、Bullet
というgemを使う
N+1問題とは?
N+1問題とは、ある一つのSQLで取得したデータに対して、データの数(N)さらにSQLを投げてしまいパフォーマンスが悪化してしまう問題のこと
JOINして1つのSQLを発行すれば解決できる問題だが、RailsなどのORラッパーを使っていると発生させてしまいがちで、下記理由から気づきにくい問題である
- エラーが発生するわけではなく、機能的には問題がない
- 開発時の少ないデータではパフォーマンスへの影響がすくないため、問題に気づきにくい
RailsでN+1問題に気づくためには
Rails Server の画面にSQLが出力されるので、それを見ていても気づくこともできる
が、どこのロジックで発生しているか等わかりにくい
Bullet
というgemを使うと、開発環境でSQLのクエリを監視してくれ、N+1のクエリを見つけたら警告してくれる