MENU
カテゴリー

【Ruby on Rails】N + 1の理解とそれを解消するRailsのN + 1対策メソッドについて

  • URLをコピーしました!
目次

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キャッシュの生成使用する場面
joinsINNER JOIN無し関連テーブルでの絞り込み
left_outer_joinsLEFT OUTER JOIN無し関連テーブルでの絞り込み
eager_loadLEFT OUTER JOIN有りループ内で関連テーブルの値を使用する場合
preloadSELECT句をモデル毎に1回ずつ有りループ内で関連テーブルの値を使用する場合

あと1つincludesメソッドが存在しますが、このメソッドは状況に応じていい感じに挙動を変えてくれるメソッドになります。そのため、includesメソッドを使用する場合は注意をする必要があるため、あまり使用を推奨されていないっぽいです。詳しくは調べてください。

よかったらシェアしてね!
  • URLをコピーしました!
目次