0
0

More than 3 years have passed since last update.

データが余計に照合されて動作が重くなるN+1問題を解決したい

Last updated at Posted at 2020-08-28

【概要】

1.結論

2.N+1問題とは何か

3.なぜN+1問題になるのか

4.N+1問題を解決する方法

1.結論

includesメソッドを使う!


2.N+1問題とは何か

アソシエーションをしている時に起こる問題です。
対策せずにアソシエーションを組むと
AデータベースとBデータベースが
一個一個全てを参照していくことをしてしまうため
処理が多くなってしまい動作が遅れてしまう問題です。

由来は、全てのレコードをまとめて1個+中身のレコードN個分ということでN+1となっています。


3.なぜN+1問題になるのか

例えば下記の例を見てみます。

N+1問題

class Student < ActiveRecord::Base
 has_many :personals
end

class Personal < ActiveRecord::Base
 belongs_to :student
end

Student_Tabel

id student_name student_age
1 Ayabe 15
2 Sato 16
3 Ito 14

Personal_Tabel

id student_id student_personality
1 1 angry
2 2 gentle
3 3 smart
4 1 shy
5 1 forgetful

この状態の時に、

@students = Student.all

とすると、StudentとPersonalを
モデルとデーターベースで1個ずつ照合した上で、
またコントローラーでビューに反映させる際に
同じことをしてしまいます。

この形ですと、(Studentsテーブル1回+データの参照回数15回)*2回
の処理を行ってしまうということですね!


4.N+1問題を解決する方法

この問題を解決してくれるのが、includesメソッドです!

モデルとデーターベースで1個ずつ照合してしまう部分をとりあえず関連されたモデルは全部持ってきて、コントローラーでビューに反映させる際に1個ずつ照合することができます。

2度同じことしなくて済むのでその分処理が軽くなります。
上記は少ないデーターなのでたいしたことはないですが、これが何千個何万個となると処理もその分違いが出てきます。

使用の仕方は

@students = Student.includes(:personal)

モデルの名前.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