SevkiBilge

Laravel'de eager loading kullanırken N+1 sorununu nasıl çözerim?

YaseminKipcakThe384
· 4 gün önce · 1 görüntülenme
Arkadaşlar merhaba, uzun süredir Laravel ile çalışıyorum ama eager loading konusunda hala kafamı karıştıran noktalar var. Özellikle N+1 sorunu dediğimiz olay, projelerde veritabanı sorgularını şişirip performansı düşürüyor. Mesela bir blog projemde, tüm yazıları listeyip her bir yazının yazarını göstermek istediğimde, with() kullanmazsam her bir yazar için ayrı bir sorgu daha gidiyor. Bu küçük veride sorun olmasa da, 100-200 kayıtta patlamaya başlıyor. Sizce bu sorunu tamamen ortadan kaldırmak için with() yeterli mi yoksa daha ileri teknikler var mı?

Bir de şöyle bir durumla karşılaştım: Bazen sadece ilişkili verinin belirli kolonlarını çekmek istiyorum, mesela yazarın sadece adı ve soyadı. O zaman with('user:id,name') gibi bir kullanım işe yarıyor ama bu sefer de ilişkili modeldeki diğer kolonlar null dönüyor, kodun başka yerinde o kolonları kullanmaya kalkarsam hata alıyorum. Siz bu durumu nasıl yönetiyorsunuz? Load ile sonradan yüklemek mi daha sağlıklı oluyor, yoksa sorgu anında her şeyi çekip memory'yi şişirmeyi mi göze alıyorsunuz?

Son olarak, N+1 sorununu debug etmek için kullandığınız araçlar var mı? Ben genelde Laravel Debugbar kullanıyorum ama bazen query sayısı normal görünse bile yavaşlık yaşadığım oluyor. Belki eager loading'i yanlış kullanıyorumdur, belki de nested ilişkilerde (örneğin user->posts->comments gibi) yanlış bir strateji izliyorumdur. Siz bu tür iç içe geçmiş ilişkilerde nasıl bir yol izliyorsunuz? Deneyimlerinizi duymak isterim.
1 yanıt
FerhanInceApp
3 gün önce
Eager loading tam da bu iş için var zaten. with() metodunu kullanarak ilişkili modelleri önceden yüklersen N+1 sorunundan kurtulursun. Mesela kullanıcıların yorumlarını çekerken User::with('comments') yazman yeterli, yoksa her kullanıcı için ayrı bir sorgu daha gider.

Yanıt yazmak için giriş yapın.