1. Veritabanı İndekslemeyi Kullanın
Veritabanı indeksleme, sorgu sürelerini büyük ölçüde azaltabilir. Django'nun sağladığı index özelliği sayesinde, sorgular daha hızlı çalışır. Ancak, her alana indeks eklemek yerine, gerçekten gerekli olan alanlara indeks eklemek önemlidir. Gereksiz indeksler, veritabanı yazma işlemlerini yavaşlatabilir.
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
class Meta:
indexes = [
models.Index(fields=['name']),
]
Bu örnekte, sadece "name" alanına indeks ekledik. Bu, ürünleri adlarına göre arayan sorguların hızlanmasını sağlar.
2. Sorguları Optimize Edin
Veritabanı sorguları, Django projelerinde büyük bir etkendir. select_related ve prefetch_related gibi özellikleri kullanarak, ilişkili modellerde yapılacak sorguları optimize edebilirsiniz. Bu iki özellik, veritabanı bağlantılarını minimize eder ve sayfa yükleme hızlarını artırır.
# select_related, tek bir sorgu ile ilişkili objeleri alır
books = Book.objects.select_related('author').all()
# prefetch_related, çoklu sorgularda ilişkili objeleri alır
books = Book.objects.prefetch_related('genres').all()
Bu teknikler sayesinde, Django veritabanı işlemlerinizde gereksiz sorgu yapmaktan kaçınabilirsiniz.
3. Veritabanı Cache Kullanımı
Veritabanı işlemleri çok zaman alabilir, ancak verilerinizi belleğe alarak bu yükü hafifletebilirsiniz. Django’nun cache framework'ü sayesinde, sıkça erişilen veriler belleğe alınarak daha hızlı bir şekilde kullanıcıya sunulabilir. Bu sayede veritabanı üzerindeki yük azalır ve uygulamanız hızlanır.
from django.core.cache import cache
def get_product_details(product_id):
product = cache.get(f'product_{product_id}')
if not product:
product = Product.objects.get(id=product_id)
cache.set(f'product_{product_id}', product, timeout=3600)
return product
Bu örnekte, ürün detayları bir kez alınır ve sonraki erişimlerde cache üzerinden hızlıca getirilir.
4. Veritabanı Sorgularını Analiz Edin
Django’nun sağladığı django.db.connection.queries modülü ile hangi sorguların veritabanında ne kadar süre harcadığını analiz edebilirsiniz. Bu sayede, performans sorunlarına yol açan sorguları belirleyebilir ve iyileştirme yapabilirsiniz.
from django.db import connection
def view_function(request):
# Some database operations here
queries = connection.queries
print(queries)
return render(request, 'index.html')
Bu yöntem, sorgu sürelerini ve sayısını anlamanıza yardımcı olur.
5. Veritabanı Bağlantı Havuzları
Django'da veritabanı bağlantıları, her yeni istekte yeniden açılır. Bu işlem zaman alabilir. Bağlantı havuzları kullanarak, bağlantıların yeniden kullanılmasını sağlayabilir ve böylece uygulamanızın performansını artırabilirsiniz.
6. Gereksiz Veritabanı Sorgularından Kaçının
Bazı sorgular, özellikle büyük veri setlerinde, veritabanını gereksiz yere zorlayabilir. Bu tür sorgulardan kaçınmak, veritabanı performansınızı artırmanın en basit yollarından biridir. Ayrıca, doğru veri alımını hedefleyen sorgular yazmak da önemlidir.
7. Django ORM Optimizasyonu
Django'nun ORM sistemi kullanıcılara büyük kolaylık sağlar ancak bazı durumlarda manuel SQL yazmak gerekebilir. Django'nun raw SQL sorguları ile daha özelleşmiş ve verimli sorgular yazabilirsiniz.
from django.db import connection
def custom_sql_query():
with connection.cursor() as cursor:
cursor.execute("SELECT * FROM myapp_product WHERE price > 50")
result = cursor.fetchall()
return result
Bazen, Django'nun ORM'si yerine doğrudan SQL kullanmak, çok daha hızlı sonuçlar verebilir.