Django는 널리 사용되는 Python 웹 프레임워크입니다. ORM(Object-Relational Mapping) 기능은 웹 개발에서 널리 사용되어 개발자가 데이터베이스를 직접 운영하지 않고도 Python 개체를 통해 작업할 수 있습니다. 그러나 데이터 양이 증가함에 따라 ORM 성능이 저하될 수 있습니다. 따라서 이 글에서는 애플리케이션의 성능을 향상시키기 위한 몇 가지 Django ORM 최적화 팁을 소개하겠습니다.
Django ORM의 .select_관련() 메소드는 모든 관련 개체의 데이터를 미리 로드할 수 있으므로 데이터베이스에 대한 여러 쿼리를 피할 수 있습니다. 기본적으로 ORM을 사용하여 데이터베이스를 쿼리할 때 Django는 기본 모델에서만 데이터를 가져옵니다. 모델에 하나 이상의 외래 키가 있는 경우 .select_관련()을 통해 모든 외래 키 객체를 가져올 수 있습니다. 예를 들어
books = Book.objects.select_related('publisher').all()
위 코드에서 Books 모델에는 외래 키 출판사가 있습니다. 연관된 출판사 모델을 선택하면 한 번의 쿼리로 모든 관련 데이터를 얻을 수 있습니다. 이렇게 하면 후속 쿼리에서 데이터베이스에 대한 반복적인 액세스가 방지되고 성능이 향상됩니다.
.select_관련()과 유사하게, .prefetch_관련() 메소드는 여러 데이터베이스 쿼리를 피하기 위해 지정된 모델의 데이터를 메모리에 미리 로드할 수도 있습니다. 차이점은 .prefetch_관련() 메소드가 다대다, 역연관 및 기타 모델 간의 액세스에 사용된다는 것입니다. 예:
publishers = Publisher.objects.prefetch_related('books').all()
위 코드에서 게시자 모델에는 역연관 서적이 있고 .prefetch_관련 ()는 한 번만 사용할 수 있습니다. 여러 데이터베이스 쿼리로 인한 오버헤드를 방지하여 모든 게시자를 한 번에 가져옵니다.
Django ORM의 .values() 및 .values_list() 메서드를 사용하면 지정된 모델의 데이터를 목록으로 수집하여 개체 수를 줄일 수 있습니다. 데이터베이스에 대한 쿼리. 예를 들어
authors = Author.objects.all().values('name', 'email')
위 코드에서는 작성자의 이름과 이메일만 가져오고 .values() 메서드를 사용하면 결과를 한 번에 얻을 수 있습니다.
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_관련( ) 책 저자 데이터를 미리 로드하여 데이터베이스 액세스 횟수를 줄이는 방법입니다.
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'), ]
위 코드에서는 제목 및 작성자 열을 기반으로 쿼리할 두 개의 인덱스를 정의합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!