0
0

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.

N+1問題の解決法(Ruby on Rails)

Posted at

N+1問題とは

1つのテーブルへのSQL発行と。N回の関連デーブルへのSQL発行が発生してしまうこと。
データ量が多い大規模サービスで顕著に低いパフォーマンスが現れてしまう。

## 対象のモデル
N+1問題を確認するモデルは,tag_categoryモデルとtagモデル。
以下の2つのモデルは1対多の関係になっている。
Image from Gyazo

SQL発行のタイミング

例えば以下の処理をコンソールから入力したとする。

Ruby
Tag.find(1)

このコードでは、Tagsテーブルのレコードからidが1のものを検索しTagモデルのインスタンスを生成している。

関連するモデルの値を生成するSQL

Ruby
Tag.find(1).tag_category

このコードを実行すると。

  1. idが1のレコードをTagsテーブルから取得する
  2. 検索結果のレコードからtag_catory_idを取得する
  3. tag_categorysテーブルから2で検索したtag_category_idのレコードを取り出す
  4. 検索したレコードからtag_categoryインスタンスを生成する

N+1問題が起こる仕組み

ループによってインスタンスを複数生成する場合にN+1問題が発生する。

Ruby
Tag.limit(5).each do |tag|
  tag.tag_category
end

以下のコードを実行すると、

  1. Tagテーブルから5件のレコードを取得する
  2. ブロック内で書くTagインスタンスに基づくtag_categoryインスタンスを取得するループ処理を行う

よって、このコードでは5+1回SQLの発行が行われN+1問題が発生している。

N+1問題を解消する方法

アクティブレコードで以下のメソッドを使用してSQLを発行する。

  1. joins
  2. left_outer_joins
  3. eager_load
  4. preload
  5. includes
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?