Bir Laravel uygulaması geliştirdiyseniz ve yerel ortamda hızlı ama üretimde yavaş olduğunu fark ettiyseniz, muhtemelen N+1 sorgu problemi ile karşılaşmışsınızdır.
Bu problem, arka uç geliştirmede en yaygın performans sorunlarındandır ve birçok geliştirici bunun gerçekleştiğinin farkında bile değildir.
N+1 Sorgu Problemi Nedir?
N+1 Sorgu Problemi Nedir?
N+1 problemi, aşağıdaki durumlarda ortaya çıkar:
- 1 sorgu çalıştırarak veri almak
- Sonrasında ilişkili verileri almak için N ek sorgu çalıştırmak
$users = User::all();
foreach ($users as $user) {
echo $user->posts;
}
10 kullanıcı varsa, Laravel aşağıdaki sorguları çalıştırır:
- 1 kullanıcılar için sorgu
- 10 gönderiler için sorgu
Toplam: 11 sorgu
Neden Tehlikeli?
Küçük ölçeklerde zararsız gibi görünebilir.
Büyüdüğünde:
- 100 kullanıcı = 101 sorgu
- 1000 kullanıcı = 1001 sorgu
Bu durum:
- Yavaş yanıt süreleri
- Yüksek veritabanı yükü
- İyi olmayan kullanıcı deneyimi
Çözüm: Eager Loading
Çözüm: Eager Loading
Laravel, with() kullanarak basit bir çözüm sunar:
$users = User::with('posts')->get();
Artık Laravel şöyle sorguları çalıştırır:
- 1 kullanıcılar için sorgu
- 1 gönderiler için sorgu
Toplam: 2 sorgu
Derinlere İnmek: İç İlişkiler
Derinlere İnmek: İç İlişkiler
Problem, iç ilişkilerle daha da kötüleşir:
$users = User::all();
foreach ($users as $user) {
foreach ($user->posts as $post) {
echo $post->comments;
}
}
Çözüm:
$users = User::with('posts.comments')->get();
Hızlı İpuçları
- Her zaman Laravel Debugbar ile sorguları inceleyin
- API kaynakları ve dönüştürücülerle dikkatli olun
- İlişkileri dönerken varsayılan olarak eager loading kullanın
Sonuç
N+1 sorgu problemi kolayca gözden kaçabilir, ancak onu görmezden gelmek maliyetlidir.
Ölçeklenebilir Laravel uygulamaları geliştirmeye ciddiyseniz, bu kavramı ustaca kavramak gereklidir.
Kaynak: Orijinal Makale


