Laravel'de Veritabanı Sorgularını Optimize Etmek

Laravel uygulamalarında veritabanı sorguları sıkça darboğaz oluşturur. Özellikle ilişkili veriler çekerken yanlış yaklaşım binlerce gereksiz sorguya neden olabilir.

En yaygın sorun N+1 problemidir. Örneğin 100 yazarın tüm postlarını listelemek istediğinizde, yazarları çeken 1 sorgu, her yazarın postlarını çeken 100 sorgu olmak üzere toplam 101 sorgu çalışır. Bu kaçınılabilir.

1// Yanlış: N+1 sorgusu
2$authors = Author::all();
3foreach ($authors as $author) {
4echo $author->posts; // Her döngüde 1 sorgu
5}
6
7// Doğru: Eager loading
8$authors = Author::with('posts')->get();
9foreach ($authors as $author) {
10echo $author->posts; // Toplam 2 sorgu
11}

with() metodunu kullanarak ilişkileri önceden yüklersiniz. Birden fazla ilişki için with(['posts', 'comments']) yazabilirsiniz.

Daha karmaşık durumlar için whereHas() ve has() metodları işe yarar. whereHas() ile ilişkili verilere göre filtreleme yaparsınız:

1// En az 5 postu olan yazarları bul
2$authors = Author::whereHas('posts', function ($query) {
3$query->where('published', true);
4}, '>=', 5)->get();

Sorguları kontrol etmek için Laravel Debugbar kullanın. Hangi sorguların çalıştığını, kaç kez tekrarlandığını gerçek zamanlı görebilirsiniz.

Seçici sütun çekme de önemlidir. Binlerce satırdan sadece id ve name lazımsa, select() ile sınırlayın:

1$authors = Author::select('id', 'name')->get();

Pagination, limit() ve offset() ile büyük veri setlerini parçalayın. Veritabanı indekslerini doğru yerleştirin; sık sorgulanan alanlar üzerine index oluşturun.

Bu optimizasyonlar uygulandığında sorgu sayısı dramatik düşer, sayfalar hızlanır.

konu hakkında tepkinizi verebilirsiniz