티스토리 뷰

장고 쿼리 최적화에서 빼놓을수 없는것들


간단하게 정리하려고한다


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 라는 것을 사용해서


페이지별 쿼리를 비교하며 최적화를 진행중.



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함