N+1 질문이란 무엇입니까?

2414 단어 RubyRails

1. "N+1 질문"은 무엇입니까?


연관을 사용할 때 데이터베이스에 대한 액세스 횟수가 많아지는 문제를 "N+1 문제"라고 합니다.
예를 들어 트위터 게시물 (tweet) 이 사용자 (user) 와 관련이 있다고 가정합니다.그리고 데이터베이스에서 모든 트위터 투고를 얻은 후 관련을 통해 사용자 정보를 얻는다.
이 때, 다음 코드는 터미널에 이러한 로그를 표시합니다.
class TweetsController < ApplicationController
  def index
    @tweets = Tweet.all
  end
end

파란색은 Tweets 테이블과 Users 테이블에 액세스하는 로그입니다.
Tweets 테이블에는 한 번에 모든 정보를 가져오지만 Users 테이블에는 여섯 번 액세스합니다.
(이 때 Tweets 테이블의 Tweet 레코드는 6개입니다.)
검색된 모든 Tweet에 대해 연관된 검색 사용자 레코드를 재사용하는 프로세스를 나타냅니다.트위터 게시물 100개를 얻으면 사용자 테이블을 100번 방문해 데이터를 얻는 데 오랜 시간이 걸린다는 얘기다.이것은 응용 프로그램의 성능을 현저히 떨어뜨릴 것이다.이것이 바로 "N+1 문제"입니다.이 문제를 해결하려면includes 방법을 사용하십시오.

2. includes 방법

モデル名.includes(:アソシエーションで紐付くモデル名)
includes 방법은 매개 변수에 지정된 관련 모델을 한 번에 접근해서 얻을 수 있는 방법입니다.다음과 같이 코드를 다시 작성하려면 이 방법을 사용하십시오.
class TweetsController < ApplicationController
  def index
    @tweets = Tweet.includes(:user)
  end
end

결국 옅은 파란색이 두 개로 변했다.Tweets 테이블에 한 번 액세스하면 모든 정보를 얻을 수 있습니다.

3. 마지막


나 자신은 지금까지 학습에서 방대한 데이터의 사용을 구상하지 못했다.그래서 저는 "N+1 문제"를 배워서 응용 프로그램 성능 개발의 중요성을 느꼈습니다.이 글을 읽고 내용이 좋으면 LGTM를 부탁합니다!그리고 의견이 있으면 꼭 댓글을 달아주세요.

좋은 웹페이지 즐겨찾기