Data boyutu çok büyükse eager loading kullanmıcaksınız.N+1 query bazen daha faydalı olacaktır.
n+1 ile eager loading arasındaki farkı görürseniz neyi nerde kullanacağınızı iyi tespit edebilirsiniz.
Ornegin soyle anlatayım.
user
- comments
normalde eager loading kullanmazsanız kullanıcıları ve kullanıcılara ait yorumları nasıl çekersiniz.
1- select * from users; (bu birinci query)
2- her bir user için comments query (select * from comments where user_code=user.code)
kayıt adetinin +1 fazlası kadar query yapacaksınız.Yani 20 tane user listeliyorsanız 20+1 = 21 query yapacaksınız.
Hımm!!! Mantıklı gelmiyor ama ayrıntıya dikkat edin.Comments query si sizin kontrolünüzde.
Şimdi laravelin eager loading ine bakalım...
select * from users;
select * from comments whereIn(user_code,user_code,user_code); //ne kadar user cektiyseniz user_codelarını alıyor.
yani sadece 2 query ile işi bitiriyor..farka bakın 21 query nerede 2 query nerede..
Eager loading ile whereIn yapıyor, yani ne kadar kayıt eşleşmesi varsa bunları alıp grupluyor..ve her kaydın altına ilişkilerini koyuyor..
Ancakkkkk!!! mesele şu..whereIn kullanıldıgı icin butun yan tumceler işler, tek bir komut haric.
O da pagination..cunku pagination listeyi kısar..yani
whereIn(1,2,3,4,6); bu sayılar user_id leri temsil etsin..ve eager loading yapıyoruz haliyle..
ornegin limit 1 kullanırsanız..
sadece id s i 1 olan kaydın ilişkisinden 1 adet gelecektir..2,3,4,5,6 nolu user in ilişkileri boş olacaktır.
Haliyle ilişkileriniz kayıp..
Peki ne yapacaz: Bütünüyle ilişki adeti ve sayıya göre kaydı cok olan modellerde eager loading kullanmayacagız.
20 şerli n+1 daha mantıklı olabilir.Buna siz karar vereceksiniz.Obur turlu bir user in 1 milyon commenti oldugunu dusunurseniz..Eager loading sizce mantıklı mı? kaynak tüketiminiz artacak ve response time larınız uzayacak..
Sonuc : eager loading dikkatli kullanılırsa faydalıdır.Obur turlu hunharca eager loading kullanımı kaynak tuketimine sebep olur.ve başınızı ağrıtır.