django

django query 최적화 시키기 - prefetch_related

발전생 2021. 2. 11. 18:55

흠...

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