目次
N + 1問題とは
本当はモデル同士の関連なども解説したいのですが、時間がかかるので詳しくは書きません。
N + 1問題は、rails serve
を実行した際に、SQLが複数発行されている状態を言います。
例えば、UserモデルとUserCategoryモデルがあったとします。
UserとUserCategoryは1対多の関係です。
そのため、N + 1問題が発生している時は、
UserテーブルへのSQL発行と、UserCategoryテーブルへのSQL発行が複数回行われている状態です。
この関連のあるテーブル(UserCategory)へのSQL発行が複数回行われてしまっていることがN+1問題と言われるもので、これがアプリケーションのパフォーマンス劣化に影響します。これを改善していく必要があります。
N + 1対策メソッドについて
RailsではN + 1を解消するためにいくつかのメソッドが用意されています。
以下の5つです。
joins
left_outer_joins
eager_load
preload
includes
これらのメソッドを使用してN + 1問題を解消していきます。
N + 1メソッドの比較
メソッド名 | 発行されるSQL | キャッシュの生成 | 使用する場面 |
---|---|---|---|
joins | INNER JOIN | 無し | 関連テーブルでの絞り込み |
left_outer_joins | LEFT OUTER JOIN | 無し | 関連テーブルでの絞り込み |
eager_load | LEFT OUTER JOIN | 有り | ループ内で関連テーブルの値を使用する場合 |
preload | SELECT句をモデル毎に1回ずつ | 有り | ループ内で関連テーブルの値を使用する場合 |
あと1つincludesメソッドが存在しますが、このメソッドは状況に応じていい感じに挙動を変えてくれるメソッドになります。そのため、includesメソッドを使用する場合は注意をする必要があるため、あまり使用を推奨されていないっぽいです。詳しくは調べてください。