[django] 쿼리 최적화

최승언·2023년 3월 15일
0

django

목록 보기
11/15
post-thumbnail

django에서는 쿼리를 최적화 하기 위한 함수를 제공하고 있다.
일단 쿼리문 최적화를 하기위한 이유는 다음과 같다.

  • 데이터를 조회하는 양이 줄어들어 속도를 개선할 수 있다.
  • DB서버에 요청하는 데이터 양이 줄어들어 서버 부하 감소
  • 스케일링: 더 많은 사용자가 데이터 처리 가능
  • 보안 최소화 가능

쿼리문을 최적화하기 위한 함수는 select_related와 prefetch_related가 있는데, 2개의 함수 설명은 다음과 같다.

  • select_related: 참조된 모델의 데이터를 조회할 수 있으며, ForeignKey나 OneToOneField와 같은 관계 필드를 사용하는 경우, 해당 필드에 대한 JOIN을 수행하여 쿼리 수행 시 필요한 정보를 한 번에 가져올 수 있도록 한다.
  • prefetch_related: 역참조된 모델의 데이터를 조회할 수 있으며, ManyToManyField와 같은 다대다 관계 필드를 사용하는 경우, 관련된 모든 객체를 미리 캐시하여 필요한 정보를 한 번에 가져올 수 있도록 한다.

다음은 각 매서드에 대한 사용예시 이다.

# select_related() 예시
from django.db import models

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    ...

class Author(models.Model):
    name = models.CharField(max_length=100)
    ...

# Book과 Author의 관계에 대한 JOIN 수행
books = Book.objects.select_related('author').all()

# prefetch_related() 예시
from django.db import models

class Book(models.Model):
    authors = models.ManyToManyField(Author)
    title = models.CharField(max_length=100)
    ...

class Author(models.Model):
    name = models.CharField(max_length=100)
    ...

# Author와 Book 객체 모두 미리 캐시하여 필요한 정보를 한 번에 가져옴
books = Book.objects.prefetch_related('authors').all()

위 예시에서 select_related() 메서드는 Book 모델과 Author 모델의 관계 필드인 author에 대한 JOIN을 수행하여 필요한 정보를 한 번에 가져오고, prefetch_related() 메서드는 Book 모델과 Author 모델의 다대다 관계 필드인 authors와 관련된 객체들을 미리 캐시하여 필요한 정보를 한 번에 가져온다. 이러한 방식으로 데이터베이스 쿼리를 최적화하면, 성능 개선을 기대할 수 있다.

profile
작업하다가 막힌부분을 기록하는 곳.

0개의 댓글