ruby on rails で実装していて基本的だが重要な負荷対策が2つあったので、紹介したい。
eager-loadingと、indexの追加です。
eager-loading
eager-loadingは、N+1問題を解決するためにあります。
N+1問題とは、データをDBから取り出そうとするとき、
sqlの処理がN+1回走ってしまう問題です。これを解決するのが、eager-loadingです。
eager-loadingは、事前にデータをロードするというもので、このN+1問題を解決してくれます。
具体的には、userとbookモデルが1対多の関係になっていた場合、以下のようになります。
**book.user.nameで毎回、userを抽出するsqlが発行されてしまう**
@books = Book.all
@books.each do |book|
puts book.user.name
end
**eager-loadingで解決できる**
@books = Book.all.includes(:user)
@books.each do |book|
puts book.user.name
end
includes(:user)によって事前にローディングして解決できます。
indexの追加
データベースのテーブルからデータを抽出する際、通常は上から順番にデータを見ていき、該当するデータを抽出します。データ量が多いと時間がかかるので、検索しやすいようにしてくれるのがindexになります。
indexの貼り方は以下になります。
**indexの貼り方(migrationファイルに記述)**
class AddIndexToテーブル名 < ActiveRecord::Migration
def change
add_index :テーブル名, カラム名
end
end