Closed1

N+1 クエリ問題とは?

EliEli

💡 N+1 クエリ問題とは?

N+1クエリ問題とは、あるデータを取得するときに「無駄なSQLがたくさん発行される」問題 のこと。

例:N+1クエリが発生するコード

books = Book.all  # ここで全てのBookを取得(1クエリ)

books.each do |book|
  puts book.author.name  # ここで author を取得するごとに1クエリ発行(Nクエリ)
end

これだと

  1. SELECT * FROM books; (1回目のクエリ)
  2. SELECT * FROM authors WHERE id = ?; (Bookの数だけ発生 = N回のクエリ)

結果的に 1 + N クエリが発生してしまう。

解決策:includes を使う

books = Book.includes(:author)  # 事前に author もまとめて取得(1回のクエリ)

books.each do |book|
  puts book.author.name  # 追加のクエリは発生しない
end
このスクラップは2日前にクローズされました