Django ORM ile Veritabanı Sorgularını İyileştirme
# 1. `select_related` ve `prefetch_related` ile İlişkili Verileri Optimize Etme
- `select_related`: Bu yöntem, "ForeignKey" ve "OneToOne" ilişkileri için kullanılır. İlişkili veriyi tek bir sorguyla alır ve veritabanı bağlantısı üzerinde fazla yük oluşturmaz.
```python
# select_related ile ilişkili verileri optimize etme
books = Book.objects.select_related('author').all()
```
- `prefetch_related`: Bu yöntem, "ManyToMany" ve "Reverse ForeignKey" ilişkileri için idealdir. Birden fazla sorgu çalıştırmak yerine, ilişkili verileri önceden getirir.
```python
# prefetch_related ile ilişkili verileri optimize etme
books = Book.objects.prefetch_related('tags').all()
```
Her iki yöntem de Django'nun sorguları birleştirmesini sağlayarak, veritabanına yapılan gereksiz istekleri engeller.
# 2. Django’da Sorgu Önbellekleme
```python
from django.core.cache import cache
# Veritabanındaki veri
def get_books():
books = cache.get('books_list')
if not books:
books = Book.objects.all()
cache.set('books_list', books, timeout=3600) # 1 saat boyunca cache'de tut
return books
```
Önbellekleme, özellikle veri değişikliklerinin nadiren olduğu durumlarda çok etkili olabilir. Ancak, veri güncellemeleri sırasında cache'in güncellenmesini unutmamak gerekir.
# 3. Veritabanı Bağlantıları ve İndekslemeyi Optimize Etme
İndeksleme de veritabanı performansını iyileştirmenin önemli bir yoludur. Özellikle büyük tablolarda arama ve sıralama işlemleri sırasında indeksleme kullanmak sorgu süresini ciddi şekilde azaltabilir.
```python
class Book(models.Model):
title = models.CharField(max_length=255, db_index=True)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
```
İndeksleme, veritabanının büyük veri kümelerinde arama işlemlerini çok daha hızlı hale getirebilir. Ancak, her alan için indeks oluşturmak da veritabanı boyutunu artırabilir, bu yüzden indeksleri doğru bir şekilde seçmek önemlidir.
# 4. Ağır Sorguları Tespit Etmek ve Çözmek İçin Araçlar
```python
# Debug Toolbar ile sorguları izleme
from django.db import connection
def slow_query():
query = Book.objects.all()
print(connection.queries)
```
Bunlar, Django projelerindeki performans darboğazlarını tespit etmek için kullanabileceğiniz güçlü araçlardır.
Django’nun Veritabanı Sorguları Üzerinde Yaptığı İyileştirmeler
Veritabanı sorgularınızın daha hızlı çalışmasını istiyorsanız, Django’nun sunduğu bu optimizasyon tekniklerini kullanmak büyük bir fark yaratacaktır. Performans iyileştirme süreci, doğru araçları kullanmak ve doğru teknikleri uygulamakla başlar.
İçerik sonu.