django

django query 최적화 시키기 - update는 비동기로

발전생 2021. 2. 11. 20:18
def get_object(self):
        review = super().get_object()
        # 조회수 1 증가
        review.watch += 1
        review.save()
        return review

이와 같이 객체를 가져와서 속성을 변경한 뒤 저장(update)을 하는 로직이다. 

그런데 무려 4ms나 걸린다. 어떻게든 줄여야겠다는 생각이 든다.

DetailView라서 watch 속성만 가져오는 건 불가능하다. name을 비롯해 여러 속성이 보여야 한다.

 

생각을 해보다가 마땅한 방법이 없어서 celery가 나중에 처리해주는 방식을 선택했다. 

덕분에 update query 작업이 없어져서 6ms -> 2ms로 로딩 속도를 줄일 수 있었다.

def get_object(self):
        review = super().get_object()
        # 조회수 1 증가
        increase_watch.delay(review.id)
        return review

 

아래는 조회수 증가를 위해 따로 만들어준 tasks.py 파일이다.

from celery import shared_task
from reviewzip.models import Review

@shared_task
def increase_watch(review_id):
    review = Review.objects.only('watch').get(id=review_id)
    review.watch += 1
    review.save()

 field update는 비동기 celery를 이용하는 게 좋다고 본다.