[종결] n+1이슈를 해결해라

  • queryset은 lazy하다! 바로 execute하지 않는다
  • foreign key로 바라보는 데이터는 또다시 query를 수행해야 가져올 수 있다

N+1 Query 문제

1) N+1 Query

하나의 쿼리에서 생겨난 결과 리스트에 루프를 돌고, 결과 리스트의 각 결과별로 또다른 쿼리는 수행하는 것

result_list = query_result
for r in result_list:
	# query 수행

2) 2N+1 Query

3) NM+N+1 Query

N+1 Query '해결'을 위한 도구들

select_related는 같은 쿼리에서 fetch
prefetch_related는 second query를 사용

1) select_related()

1:1 또는 1:M 관계에서만 효과가 있음 (M:M 관계에서는 prefetch_related를 사용)
중복 발생 가능

2) prefetch_related()

중복 발생 없음

3) django-auto-prefetch

N+1 Query '예측'을 위한 도구들

1) Django-debug-toolbar

2) nplusone

3) Scout APM

궁금쓰

django chained relation

장고 쿼리 확인하기

Reference

좋은 웹페이지 즐겨찾기