2015-11-18 20 views
9

Laravel'in uygun modelleri varsayılan olarak tembel yük olarak ayarlanmıştır. Sorun, veritabanına ve özellikle yüksek trafikte çok fazla sorgulama yapması, laravel uygulamasının çökmesi ve Yii 1'de benzer bir uygulama yapısının sorun olmamasıdır.Set Laravel Eloquent modelinin varsayılan yükü olarak istekli yüklemesi

Laravel'in hata ayıklama çubuğunu yükledikten sonra, sorun, her sayfa yüklemesinde çok fazla sorgu yapılmasını gerektirir. Bir sonraki adım optimizasyonu sorgulamaktır. Laravel'in belgelerinde belirtildiği gibi istekli yüklemeler kullanıyorum ama yine de çok fazla sorgu var.

Eloquent'i dev ortamda yalnızca "Eager Load" olarak ayarlamanın bir yolu olup olmadığını merak ediyordum. Bu şekilde sayfa yüklenemediğinde, sorunu tanımlamak daha kolay olurdu.

+1

ama senin sorunun "gibi sesler çok fazla sorgu " Bir uygulama çökmesi bildirdiğinizden, hata çıktısının veya günlüğün kilitlenme nedeni olarak ne gösterdiğini bilmek de yararlı olacaktır. – Trip

cevap

2

Yüksek veritabanı yüklemesi için çözüm Cache'dur.

Yüksek önbellek düzgün şekilde önbelleğe almak, genel veritabanı sorgularını sıfıra indirdiğinden ve bunları daha hızlı olan RAM'lere yönlendirdiğinden, yüksek trafikte inanılmaz performans sağlayabilir.

çok perfomance artacak Route Caching etkinleştirme:

php artisan route:cache 

DÜZENLEME:

Fx32 gibi noktaları, size anlamlı ihtiyaç ve doğrudan aynı sorguyu yapmak için daha iyi olmaz emin olmalısınız DB, ihtiyacınız olan tablolara katılarak ve çok fazla yerine tek bir sorgu oluştururken:

Önbellek, kötü veritabanı sorgulaması için bir çözüm olarak iyi bir çözüm değildir. Eloquent harikadır, ancak çoğu zaman bazı birleştirmelerle uygun sorguları yazmak daha iyidir. Sadece DB'nize basmayın ve daha sonra yeni sorunlara yol açacağı için sonucunu bir önbellekte atmayın. kullanımınız düz CRUD API değilse, ActiveRecord desenleri zaten en iyi çözüm olan olmayabilir. DB'yi 'dan dikkatle seçip birleştirirseniz ve bu tür öğelerin alınmasını hızlandırmak istiyorsanız, önbellekleme yardımını yapabilir.

+1

Optimizasyon işleminde bir sonraki adım olarak önbelleğe aldım. Önbelleğe alma işleminden önce, tüm sorguların olabildiğince optimize edildiğinden emin olmak istiyorum. – elixir

+1

Önbellek, hatalı veritabanı sorgulaması için bir çözüm olarak iyi bir çözüm değildir. Eloquent harika, ancak bazı katılımcılar ile uygun sorguları yazmak genellikle daha iyidir. Sadece DB'nize basmayın ve yeni sonuçları getireceğinden tüm sonuçları bir önbellekte atmayın. Kullanım durumunuz düz bir CRUD API değilse, ActiveRecord desenleri yine de en iyi çözüm olmayabilir. DB'den sonuçları dikkatlice seçer ve birleştirirseniz ve bu tür öğelerin alınmasını hızlandırmak istiyorsanız, önbelleğe alma yardımcı olabilir. – Fx32

25

Sen varsayılan ilişkileri ayarlayabilirsiniz doğrudan modellerde "hevesli yük" için: Bir dev okunur istekli yük ayarlama yolları hakkında bilgi talep etmiş

Class MyModel extends Model { 
    protected $with = ['relation']; 
}