티스토리 뷰
장고 쿼리 최적화에서 빼놓을수 없는것들
간단하게 정리하려고한다
https://docs.djangoproject.com/en/1.10/ref/models/querysets/
공식문서를 보는것이 가장 좋다.
selected_related와 prefetch_related는 둘다
쿼리를 생성할때 연관된 것들을 같이 가져오는 일을 한다.
하지만 실제로 동작하는 방식은 조금씩 다른데
selected_related를 보면
one to one 혹은 foreign key상황에서만 동작을 한다.
예를들어
주소(Address) 가족(Family) 구성원(User) 이라는 모델이 있다고생각을 해보면
id가 1인 구성원의 주소정보를 가져오기위해 일반적으로 이런 코드를 사용한다
user = User.objects.get(pk=1)
family = user.family
address = user.address
각 라인마다 한번씩 쿼리가 발생하게된다
이럴때 selected_related를 사용하게되면
user = User.objects.selected_related('family__address').get(pk=1)
family = user.family
address = family.address
맨 첫 줄에서 user를 콜 할때 이미 family, address에 대한정보를 같이 가져와서 캐싱되어있다.
반면 prefetch_related는 many to many, one to one, foreign key 모든 상황에서 사용 가능한데
위에서 언급한 주소(Address) 가족(Family) 구성원(User)에 취미(Hobby)가 있다고 가정을 해보자
이때 모든 구성원들의 취미를 출력하려고 한다면
일반적으로 이런 코드를 사용한다.
for user in User.objects.all():
for hobby in user.hobbys.all():
print hobby.name
이경우에는 반복이 돌아가면서 계속 쿼리를 호출하게되는데
prefetch_related를 사용하면 이걸 획기적으로 줄일 수 있다.
for user in User.objects.prefetch_related('hobbys'):
for hobby in user.hobbys.all():
print hobby.name
이때는 User.objects.prefetch_related('hobbys')
가 콜 되면 유저에 연관된 정보를 가져오고 딸려있는 취미의 정보도 같이 가져오기때문에
반복이 돌아갈때 쿼리가 반복되는것을 막아준다.
반복수 -> 2개의 쿼리
숙지하고 활용하면 좋을듯 하다
나는 이미 구성된 페이지들의 쿼리를 최적화하는과정이라
http://django-debug-toolbar.readthedocs.io/en/stable/
Django Debug Toolbar 라는 것을 사용해서
페이지별 쿼리를 비교하며 최적화를 진행중.
'전문성 > 백앤드' 카테고리의 다른 글
장고 타임존 세팅 문제점 해결 (0) | 2017.12.14 |
---|---|
[Django]장고 테스트 디비 사용하지 않고 테스트 하기 (0) | 2017.09.16 |
리눅스 서버 시간 설정하기 (0) | 2016.12.14 |
mysql - MyISAM, InnoDB 차이점 (0) | 2016.12.07 |