Django 프레임워크의 ORM 최적화 팁

PHPz
풀어 주다: 2023-06-17 11:57:58
원래의
1237명이 탐색했습니다.

Django는 널리 사용되는 Python 웹 프레임워크입니다. ORM(Object-Relational Mapping) 기능은 웹 개발에서 널리 사용되어 개발자가 데이터베이스를 직접 운영하지 않고도 Python 개체를 통해 작업할 수 있습니다. 그러나 데이터 양이 증가함에 따라 ORM 성능이 저하될 수 있습니다. 따라서 이 글에서는 애플리케이션의 성능을 향상시키기 위한 몇 가지 Django ORM 최적화 팁을 소개하겠습니다.

  1. .select_관련() 사용

Django ORM의 .select_관련() 메소드는 모든 관련 개체의 데이터를 미리 로드할 수 있으므로 데이터베이스에 대한 여러 쿼리를 피할 수 있습니다. 기본적으로 ORM을 사용하여 데이터베이스를 쿼리할 때 Django는 기본 모델에서만 데이터를 가져옵니다. 모델에 하나 이상의 외래 키가 있는 경우 .select_관련()을 통해 모든 외래 키 객체를 가져올 수 있습니다. 예를 들어

books = Book.objects.select_related('publisher').all()
로그인 후 복사

위 코드에서 Books 모델에는 외래 키 출판사가 있습니다. 연관된 출판사 모델을 선택하면 한 번의 쿼리로 모든 관련 데이터를 얻을 수 있습니다. 이렇게 하면 후속 쿼리에서 데이터베이스에 대한 반복적인 액세스가 방지되고 성능이 향상됩니다.

  1. .prefetch_관련() 사용

.select_관련()과 유사하게, .prefetch_관련() 메소드는 여러 데이터베이스 쿼리를 피하기 위해 지정된 모델의 데이터를 메모리에 미리 로드할 수도 있습니다. 차이점은 .prefetch_관련() 메소드가 다대다, 역연관 및 기타 모델 간의 액세스에 사용된다는 것입니다. 예:

publishers = Publisher.objects.prefetch_related('books').all()
로그인 후 복사

위 코드에서 게시자 모델에는 역연관 서적이 있고 .prefetch_관련 ()는 한 번만 사용할 수 있습니다. 여러 데이터베이스 쿼리로 인한 오버헤드를 방지하여 모든 게시자를 한 번에 가져옵니다.

  1. .values() 및 .values_list() 사용

Django ORM의 .values() 및 .values_list() 메서드를 사용하면 지정된 모델의 데이터를 목록으로 수집하여 개체 수를 줄일 수 있습니다. 데이터베이스에 대한 쿼리. 예를 들어

authors = Author.objects.all().values('name', 'email')
로그인 후 복사

위 코드에서는 작성자의 이름과 이메일만 가져오고 .values() 메서드를 사용하면 결과를 한 번에 얻을 수 있습니다.

  1. 루프 쿼리 교체

Django ORM에서 루프 쿼리를 통해 여러 데이터를 얻는 방식은 성능 병목 현상을 일으킬 수 있습니다. 예를 들어 다음 코드는 많은 데이터베이스 쿼리를 발생시킵니다:

for author in Author.objects.all():
    books = author.books.all()
    # do something with the books
로그인 후 복사

이와 대조적으로 .prefetch_관련() 메서드를 사용하여 루프 쿼리를 대체하여 데이터베이스 쿼리를 줄일 수 있습니다.

authors = Author.objects.prefetch_related('books')
for author in authors:
    # get books from prefetched related
    books = author.books.all()
    # do something with the books
로그인 후 복사

위 코드에서는 .prefetch_관련( ) 책 저자 데이터를 미리 로드하여 데이터베이스 액세스 횟수를 줄이는 방법입니다.

  1. 데이터베이스 인덱스 사용

Django ORM은 쿼리 속도를 높이기 위해 데이터베이스 인덱스 사용을 지원합니다. 인덱스는 지정된 열에 따라 데이터베이스의 데이터를 정렬하여 쿼리 프로세스를 더욱 효율적으로 만들 수 있습니다. Django에서는 모델의 Meta 클래스를 사용하여 인덱스를 정의할 수 있습니다. 예를 들면 다음과 같습니다.

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

    class Meta:
        indexes = [
            models.Index(fields=['title'], name='title_index'),
            models.Index(fields=['author'], name='author_index'),
        ]
로그인 후 복사

위 코드에서는 제목 및 작성자 열을 기반으로 쿼리할 두 개의 인덱스를 정의합니다.

  1. Database Connection Pool

Django ORM에서 데이터베이스 연결은 값비싼 리소스입니다. 따라서 데이터베이스 연결 풀을 사용하여 연결 집합을 유지함으로써 데이터베이스 연결 오버헤드를 줄일 수 있습니다. Django 애플리케이션의 경우 Django-dbconn-reuse 모듈을 사용하여 데이터베이스 연결 풀링을 구현할 수 있습니다. 설치 후 연결 풀을 활성화하려면 Django의 settings.py 파일에 다음 코드를 추가하기만 하면 됩니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'conn_max_age': 60,
            'charset': 'utf8mb4',
            'pool_size': 5
        }
    }
}
로그인 후 복사

위 코드에서는 MySQL 데이터베이스를 사용하고 연결 풀 크기를 5개의 연결로 설정했습니다.

결론

Django 애플리케이션에서 ORM은 애플리케이션과 데이터베이스 간의 상호 작용 프로세스를 크게 단순화할 수 있는 매우 강력한 기능입니다. 위의 팁과 최적화를 사용하여 ORM 성능을 개선하면 이 강력한 기능을 더 잘 활용하여 애플리케이션 성능과 안정성을 향상시킬 수 있습니다.

위 내용은 Django 프레임워크의 ORM 최적화 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿