Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Laravel’de N+1 Sorununu Ortadan Kaldırma: 120 Sorgudan 8 Sorguya 20 Dakikada
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Laravel’de N+1 Sorununu Ortadan Kaldırma: 120 Sorgudan 8 Sorguya 20 Dakikada

Yazılım

Laravel’de N+1 Sorununu Ortadan Kaldırma: 120 Sorgudan 8 Sorguya 20 Dakikada

teknomers
Son güncelleme: 3 Şubat 2026 01:08
teknomers
Paylaş
Paylaş

TL;DR — N+1 sorgu problemi, listeler üzerinde performansı ciddi şekilde yok eder.
Bunu hedefli eager loading ile (with()), SQL tarafında toplamalar
(withCount, withSum) ve temel indeksleme ile çözebilirsiniz. Debugbar/Telescope
ya da EXPLAIN ANALYZE ile ölçüm yapın. Bu yazıda tam olarak nasıl yapacağınızı göreceksiniz.


Semptom: 1 + N Sorgu

Bir liste (siparişler, gönderiler, ürünler) render ediyorsunuz. Her satır için ilişkili bir modele (->customer, ->items, ->author) erişiyorsunuz ve Eloquent, her satır için bir ekstra sorgu çalıştırıyor.

Bu durumda 1 sorgu listeyi almak için + N sorgu her satırın ilişkisi için:
20 satırda, sayımlar ve iç içe ilişkiler eklendiğinde genellikle 120 sorguya ulaşıyorsunuz.


Önce: klasik N+1

// Controller / Repository
$orders = Order::latest()->take(20)->get();

foreach ($orders as $o) {
    echo $o->customer->name;   // her satır için ekstra sorgu
    echo $o->items()->count(); // her satır için ekstra sorgu
}

Bu “çalışır”, ama pahalıdır ve hacimle daha kötü hale gelir.


Çözüm: Bir Kez Yükle, Çok Kullan


Sonra: eager loading + SQL toplamları

$orders = Order::with(['customer:id,name']) // ilişkileri tek seferde getir
               ->withCount('items')         // SQL’de sayıyı hesapla
               ->latest()
               ->take(20)
               ->get();

foreach ($orders as $o) {
    echo $o->customer->name;  // zaten bellekte
    echo $o->items_count;     // veritabanı tarafından önceden hesaplandı
}

Sonuç: tipik kurulumlarda toplam 8-10 sorgu yerine 100+ sorgu.



N+1’i Hızla Tespit Etme

  1. Laravel Debugbar veya Telescope: sayfadaki toplam sorgu sayısına bakın.
  2. Yerel ortamda katı modu etkinleştirin ve tembel yüklemeleri görün:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;

public function boot()
{
    if (!app()->isProduction()) {
        Model::preventLazyLoading();
    }
}

Bu, bir tembel yükleme gerçekleştiğinde geliştirme sırasında hata verecek ve sizi tam satıra yönlendirecektir.



Eager Loading’i Doğru Kullanma


1) Sadece ihtiyacınız olanı hedefleyin

İlişkileri yükleyin ve sütunları kısıtlayın böylece yükleme boyutlarını küçük tutun:

$posts = Post::with([
    'author:id,name',
    'tags:id,name',
])->get(['id','title','author_id']);


2) Gerektiğinde derinlemesine gidin

$posts = Post::with(['comments.author'])->get();


3) Mevcut koleksiyonlar üzerinde

Zaten modeller yüklüyse, her şeyi yeniden yüklemeden ilişkileri ekleyin:

$orders->load(['customer', 'items']);
$orders->loadCount('items');


4) Tekrarlanan eager yüklemeleri önleyin

$orders->loadMissing('customer');


Kullanmanız Gereken Toplamlar (Hepsi SQL’de)

  • withCount('items')
  • withSum('items as total_price', 'price')
  • withAvg('items', 'price')

Örnek:

$orders = Order::with('customer:id,name')
    ->withCount('items')
    ->withSum('items as total_price', 'price')
    ->latest()
    ->take(20)
    ->get();

Şimdi Blade şununla temiz bir şekilde okunabiliyor:

{{ $order->customer->name }}
{{ $order->items_count }}
{{ number_format($order->total_price, 2) }}


Veritabanı Tarafı: Planlayıcıya Bir Şans Verin

Her ne kadar mükemmel eager loading olsa da, veritabanınızda indeks yoksa sorun yaşayabilirsiniz.


Yabancı Anahtarlarınızı İndeksleyin

PostgreSQL

CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_items_order_id ON items(order_id);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_customer_id ON orders(customer_id);

MySQL

ALTER TABLE items   ADD INDEX idx_items_order_id (order_id);
ALTER TABLE orders  ADD INDEX idx_orders_customer_id (customer_id);


EXPLAIN ANALYZE ile Ölçüm Yapın

Planlayıcının mantıklı işlemler kullandığını kontrol edin (Index Scan, Hash Aggregate).
Büyük tablolarda tam taramalar görüyorsanız, muhtemelen indeksler veya daha iyi filtrelere ihtiyacınız vardır.



Gerçek Dünya Kontrol Listesi (kopyala-yapıştır)

  • [ ] İlişkili verileri kullanan her liste için with() kullanın
  • [ ] Satır başına ->count() yerine withCount() kullanın
  • [ ] Satır başına toplamları withSum() ile değiştirin
  • [ ] Sütunları kısıtlayın: relation:id,needed_columns
  • [ ] Yabancı anahtar sütunlarında indeksler ekleyin
  • [ ] Yerel ortamda Model::preventLazyLoading() özelliğini etkinleştirin
  • [ ] Debugbar/Telescope ile sorgu sayısını doğrulayın
  • [ ] Planları EXPLAIN ANALYZE ile kontrol edin


Bonus: Temel Yüklemeye Hâlâ İhtiyacınız Olduğunda

Bazen gerçekten ad-hoc ilişki erişimine ihtiyaç duyarsınız. Bunu açık ve nadir; yapın veya küçük verileri yükleyin, böylece zararı en aza indirin.

Order::whereKey($id)->first()->load('customer');

İpucu: verilerin sık kullanılması durumunda Cache::remember() ile eşleştirin.



Paylaşabileceğiniz Minimal “Önce/Sonra” Görseli

Ekibiniz veya sosyal medya paylaşımlarınız için bu tek ekran karşılaştırmasını kullanın:

- // ÖNCE — N+1: 1 liste sorgusu + N satır başına ilişkiler
- $orders = Order::latest()->take(20)->get();
- foreach ($orders as $o) {
-   echo $o->customer->name;   // her satır için sorgu 
-   echo $o->items()->count(); // her satır için sorgu 
- }
 
+ // SONRA — eager + SQL toplamları: ~8 toplam sorgu
+ $orders = Order::with(['customer:id,name'])
+                ->withCount('items')
+                ->latest()->take(20)->get();
+ foreach ($orders as $o) {
+   echo $o->customer->name;   // zaten yüklenmiş
+   echo $o->items_count;      // SQL'de hesaplandı
+ }


Yaygın Tuzaklar ve Bunlardan Kaçınma Yöntemleri

  • Çok fazla yüklemek: with('bigRelation') kolon limitleri olmadan bellek kullanımını artırabilir. with(['bigRelation' => fn ($q) => $q->select('id','fk_id','name')]) kullanın.
  • İç içe N+1: İlk ilişkiyi düzeltin… ve ikincisini unutun (comments.author). Her ikisini de yükleyin.
  • Koleksiyona göre saymak: ->items->count() (koleksiyon) kullanmaktan kaçının, withCount('items') mevcutken.
  • Önbellek geçersiz kılma: Önbellek kullanıyorsanız, her zaman filtrelere göre anahtar oluşturun (kullanıcı, dükkan, yerel ayar…).


Bunun Önemi (Benchmark’ların Ötesinde)

  • Daha hızlı sayfalar → daha yüksek dönüşüm (arama, rezervasyon, satın alma).
  • Daha düşük DB baskısı → daha küçük örnekler, daha iyi istikrar.
  • Daha temiz kod → regresyon olmadan geliştirmek daha kolay.

Kaynak: Orijinal Makale

Contents
  • Semptom: 1 + N Sorgu
    • Önce: klasik N+1
  • Çözüm: Bir Kez Yükle, Çok Kullan
    • Sonra: eager loading + SQL toplamları
  • N+1’i Hızla Tespit Etme
  • Eager Loading’i Doğru Kullanma
    • 1) Sadece ihtiyacınız olanı hedefleyin
    • 2) Gerektiğinde derinlemesine gidin
    • 3) Mevcut koleksiyonlar üzerinde
    • 4) Tekrarlanan eager yüklemeleri önleyin
  • Kullanmanız Gereken Toplamlar (Hepsi SQL’de)
  • Veritabanı Tarafı: Planlayıcıya Bir Şans Verin
    • Yabancı Anahtarlarınızı İndeksleyin
    • EXPLAIN ANALYZE ile Ölçüm Yapın
  • Gerçek Dünya Kontrol Listesi (kopyala-yapıştır)
  • Bonus: Temel Yüklemeye Hâlâ İhtiyacınız Olduğunda
  • Paylaşabileceğiniz Minimal “Önce/Sonra” Görseli
  • Yaygın Tuzaklar ve Bunlardan Kaçınma Yöntemleri
  • Bunun Önemi (Benchmark’ların Ötesinde)
Sunucu Çökme Sorunlarını Önleme: Laravel SaaS Uygulamaları için Dinamik API Hız Sınırlama
Django, Rails ve Laravel Başlangıç Şablonlarının Karşılaştırması
Çirkin Kodunuzu Yayınlayın – DEV Community
Windows’ta Birden Fazla PHP Sürümünü Çalıştırma ve Kolayca Geçiş Yapma
Laravel Test Ortamı Kurulumu – DEV Community
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Kritik Uyarı: Yeni GlassWorm Saldırısı macOS’u Tehdit Ediyor!
Sonraki Makale Intel Xeon 600 ile Çalışma İstasyonları Tekrar Geri Döndü: 86 Çekirdek, 4TB Bellek

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Mumbai’de Web Geliştirme Hizmetleri: HTML, CSS, PHP, Laravel, React ve Next.js
Yazılım
SteelSeries’ten Beklenen Eğlenceli South Park Oyun Aksesuarı
Oyun
Amazon güvenlik araştırması Beyaz Saray’ın Anthropic Fable yasağına neden oldu
Liste
Eski çalışan, eski işvereni hedef alan siber saldırılarla hapse girdi!
Siber Güvenlik
Yeni Brainrot Sniper Kodlarıyla Oyun Deneyimini Yenileyin
Oyun
KPMG Yapay Zeka Kullanım Raporunu Geri Çekti
Genel
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?