[종결] 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
- https://scoutapm.com/blog/django-and-the-n1-queries-problem
- When QuerySets are evaluated (https://docs.djangoproject.com/en/3.1/ref/models/querysets/#when-querysets-are-evaluated)
- https://soniacomp.medium.com/python-%EC%9C%BC%EB%A1%9C-db-%EB%8B%A4%EB%A3%A8%EB%8A%94-%EB%B2%95-%EC%9E%A5%EA%B3%A0-orm-c566717c49ba
- http://www.incodom.kr/Django_ORM
- https://leffept.tistory.com/312
- https://leffept.tistory.com/314?category=950490
- https://leffept.tistory.com/316?category=950490
Author And Source
이 문제에 관하여([종결] n+1이슈를 해결해라), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@muchogusto/종결-n1이슈를-해결해라저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)