흠...
query에 연결은 1번만 하지만 10 simillar가 거슬린다.
최적화시켜 본다.
우선 query 가져오는 시간부터 살펴봤다. 데이터 10개 가져오는데 8.97ms나 필요하다.
개선이 필요해 보인다.
일단 인덱스 페이지에서 나는 info만을 필요로 한다.
Review.objects.order_by('-create_date')[:5]
그래서 위 코드를 아래처럼
Review.objects.only("info").order_by('-create_date')[:5]
info 관련 필드만 가져오게 수정했다.
only() 사용만으로도 5.99ms로 줄어들었다.
새로고침 해보니까 같은 코드임에도 매번 다른 시간이 걸린다. 이 시간에 크게 연연하면 안 되겠다.
하지만 아직도 거슬린다. 10 similar queries
비교를 위해 반쪽만 prefetch_realted()를 사용해봤다.
selected_realted()는 ForeignKey 관계에서만 prefetch_related()는 ManyToMany 관계에서만 쓸 수 있다고 잘못 알고 있었다.
prefetch_related()는 OneToOne 관계에서도 가능하다.
Review.objects.only("info").order_by('-create_date')[:5].prefetch_related('info')
보다시피 위 반쪽에서는 similary queries가 안 뜬다.
자세히 보면 한 번에 이렇게 5개를 다 가져왔다.
최종적으로 2 similar는 남았지만 시간이 2ms 정도로 대폭 감소됐다. 처음에는 거의 9ms가 걸렸었다.
템플릿 태그 {% with %}도 사용해봤지만 오히려 시간이 더 늘어나는 거 같아 with는 코드에서 제거했다.
무시무시한 prefetch_related
'django' 카테고리의 다른 글
TypeError: 'Manager' object is not callable 발생 시 objects를 확인하자 (0) | 2021.02.11 |
---|---|
django query 최적화 시키기 - update는 비동기로 (0) | 2021.02.11 |
django rest framework pagination 안 되는 문제 해결 (0) | 2021.02.07 |
[윈도우] celery가 작동을 안 하는 이유, 해결책 (0) | 2021.02.03 |
visual studio code 쓰면 python manage.py runserver 안 쳐도 된다 (0) | 2021.01.31 |