Django’da Veritabanı Sorgularını Optimizasyonu
# QuerySet Optimizasyonu ve Lazy Loading
# Lazy loading örneği
author = Author.objects.get(id=1)
books = author.books.all() # Bu sorgu sadece books verisine ihtiyaç duyduğunda çalışır
Ancak, lazy loading yalnızca doğru şekilde kullanıldığında faydalıdır. Eğer ilişkili verilere sıklıkla erişiyorsanız, diğer optimizasyon tekniklerine geçmek daha iyi olabilir.
# `select_related` ve `prefetch_related` ile Hız Artırma
- select_related: ForeignKey ve OneToOne ilişkileri için ideal olan bu yöntem, ilişkili verilerin tek bir sorguda yüklenmesini sağlar. Bu, veritabanı sorgularını azaltır ve uygulamanın hızını artırır.
# select_related örneği
books = Book.objects.select_related('author').all() # Yazar bilgisi tek bir sorguyla yüklenir
- prefetch_related: ManyToMany ve reverse ForeignKey ilişkileri için daha uygun olan bu yöntem, ilişkili verileri ayrı sorgularla alır ve daha sonra bunları birleştirir. Özellikle büyük veri setlerinde *select_related*’in yetersiz kalacağı durumlarda *prefetch_related* devreye girer.
# prefetch_related örneği
books = Author.objects.prefetch_related('books').all() # Her yazar için kitap bilgileri ayrıca yüklenir
Her iki teknik de, gereksiz sorguları engeller ve büyük veri kümesi üzerinde çalışırken uygulamanızın hızını önemli ölçüde artırır.
# Veritabanı İndeksleme ve Sorgu Hızlarını İyileştirme
# Django'da bir alana indeks eklemek
class Book(models.Model):
title = models.CharField(max_length=100, db_index=True) # title alanına indeks ekler
Veritabanı indeksleri, özellikle *WHERE* ve *ORDER BY* gibi işlemlerde sorguların hızını büyük ölçüde artırır.
# Cache Kullanımı
Django’nun cache sistemi, verilerin cache'lenmesini kolaylaştırır. `cache_page` decorator'ı gibi araçlarla sayfa seviyesinde cache uygulayabilir, ya da belirli veriler için önbellek kullanabilirsiniz.
# Django'da cache kullanımı
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # Sayfayı 15 dakika boyunca cache'ler
def my_view(request):
return render(request, 'my_template.html')
Cache kullanımı, sık tekrarlanan işlemlerde büyük bir hız kazancı sağlar.
# Veritabanı Tasarımındaki En İyi Uygulamalar
- Normalizasyon, veritabanındaki veri tekrarını en aza indirir, ancak bazen sorgu performansını düşürebilir.
- Denormalizasyon, veritabanı yapısında veri tekrarı oluşturur ancak sorgu sürelerini kısaltabilir.
Doğru tasarım için, uygulamanızın ihtiyaçlarına göre dengeyi bulmalısınız.
Sonuç
Veritabanı performansını artırmak için bu teknikleri kullanarak, daha hızlı, daha verimli ve kullanıcı dostu uygulamalar geliştirebilirsiniz!