#006: Laravel Projelerinde Gizli Performans Katili N+1 Sorununa Dikkat!

Erhan ÜRGÜNErhan ÜRGÜN
2 min read

Geçen hafta bir code review yaparken, benden bi önceki geliştiricilerde birinin yazdığı kodda klasik bir N+1 sorunu tespit ettim. Sayfa yükleme süresi 3 saniyeden 200ms'ye düştü sadece tek bir satır değişiklikle.

N+1 sorunu nedir? Basitçe tanımlamam gerekirse; bir koleksiyon için 1 sorgu + her item için N ek sorgu demek. Laravel'de Eloquent ilişkilerini yanlış kullandığınızda karşınıza çıkan en yaygın performans sorunlarından biri...

Neyse ki Laravel, bu sorunu "Eager Loading" (Ön Yükleme) ile şık bir şekilde çözüyor. with() metodunu kullanarak, ihtiyaç duyacağınız tüm ilişkisel verileri sadece iki sorgu ile önceden yükleyebilirsiniz. Bu basit dokunuş, uygulamanızın performansında devrim yaratabilir.

❌ Kötü Kullanım:

// Controller'da 
$posts = Post::all(); // 1 sorgu
// View'da
@foreach($posts as $post)
    {{ $post->user->name }} // Her post için +1 sorgu (N sorgu)
@endforeach

100 post varsa = 101 veritabanı sorgusu!

✅ Temiz, Performanslı Kod:

// Eager Loading ile
$posts = Post::with('user')->get(); // Sadece 2 sorgu!
// Birden fazla ilişki için
$posts = Post::with(['user', 'comments', 'tags'])->get();
// İç içe ilişkiler için  
$posts = Post::with('comments.user')->get();

💡 Pro İpucu: Laravel Debugbar veya Telescope vb kullanarak N+1 sorunlarını kolayca tespit edebilirsiniz. Ben projelerimde ->preventLazyLoading() metodunu development ortamında aktif tutuyorum:

// AppServiceProvider.php
public function boot()
{
    Model::preventLazyLoading(! app()->isProduction());
}

Bu sayede lazy loading kullanıldığında Laravel exception fırlatıyor ve sorunlu yerleri anında görüyorum.

Bu code review işlemi sonucunda, projemizde sadece eager loading optimizasyonları ile:

  • Veritabanı sorgu sayısı: 847'den 23'e
  • Sayfa yükleme süresi: 4.2 saniyeden 0.3 saniyeye
  • Sunucu RAM kullanımı: ort. %40 azaldı

Peki siz projelerinizde N+1 sorunlarını nasıl tespit ediyorsunuz? Hangi araçları kullanıyorsunuz? Deneyimlerinizi yorumlarda paylaşın, hep birlikte öğrenelim!

Bunun gibi daha fazla paylaşım için takipte kalın:

  • DailyDev: icin.tr/dailydev
  • LinkedIn: icin.tr/linkedin
  • Portföy: icin.tr/portfolio
  • CV: icin.tr/cv
  • Tüm Bağlantılar: icin.tr/me
0
Subscribe to my newsletter

Read articles from Erhan ÜRGÜN directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Erhan ÜRGÜN
Erhan ÜRGÜN

Laravel | AdonisJS | Back-End Developer