2013-07-09 19 views
5

Sadece Laravel'deki Eloquent ORM performansını test ettim ve 0.1 saniyede biten normal Laravel sorgusuna kıyasla 3 saniyeyi geçen basit bir sorgu bulmak için şok oldu. Sadece 1500 kayıt getiriyorum.Eloquent ORM Performansı

DB::table('t_organisations')->get(); - 0.12253594398499 seconds 
Organisation::all(); - 3.6389181613922 seconds 

Elbette bu normal olamaz !? Kurulumda hiçbir şey kaçırdığımı sanmıyorum. Benim db normalleştirildi. Sorun ne olabilir?

+0

Şahsen, zaman atıklarının nerede olduğunu görmek için XDebug ile çalıştırabilirim. –

+1

Modelinizde tanımlanan herhangi bir ilişkiniz var mı? Eğer öyleyse - Eloquent çok sayıda katılım yapmalıydı ... – Laurence

+0

Özellikle büyük verileri ele alırken Query Builder'ı kullanmak için her zaman en iyisi vardır. – crynobone

cevap

2

Tüm yanıtlarınız için teşekkür ederiz. İşte

mysql sorgu günlüğünün sonucudur:

Organizasyonu :: Tüm(); - 1,6772060394287 saniye

130710 9:52:43  5 Connect [email protected] on seltec 
      5 Prepare set names 'utf8' collate 'utf8_unicode_ci' 
      5 Execute set names 'utf8' collate 'utf8_unicode_ci' 
      5 Close stmt  
      5 Prepare select * from `users` where `id` = ? limit 1 
      5 Execute select * from `users` where `id` = '2' limit 1 
      5 Close stmt  
      5 Prepare select * from `t_organisations` 
      5 Execute select * from `t_organisations` 
130710 9:52:44  5 Close stmt  
130710 9:52:45  5 Quit 

DB :: tablo ('t_organisations') -> (get); - ,13963603973389 saniye

130710 9:55:16  6 Connect [email protected] on seltec 
      6 Prepare set names 'utf8' collate 'utf8_unicode_ci' 
      6 Execute set names 'utf8' collate 'utf8_unicode_ci' 
      6 Close stmt  
      6 Prepare select * from `users` where `id` = ? limit 1 
      6 Execute select * from `users` where `id` = '2' limit 1 
      6 Close stmt  
      6 Prepare select * from `t_organisations` 
      6 Execute select * from `t_organisations` 
      6 Close stmt  
      6 Quit 

Yani, Etkili php kodunda yer almalıdır gecikme anlamına gelir orada o zaman hiçbir fark ..... Evet, ben xdebug yüklü ve hayır neden yavaş yavaş anlamaya çalışıyorum zaman harcamak için hazır değilim! Sorgu oluşturucuda daha hızlıysa, bu benim için yeterince iyi!

@Laravels geliştiricileri: çerçeve üzerinde harika bir iş. Sezgiseldir, özellikle Leroy Merlin'in güvenli ve güvenli eklentileriyle birlikte yetkilendirmelerle ilgilenir. Ancak Eloquent performans sorununa bir göz atmak isteyebilirsiniz!

Şerefe! Craig

+0

Leroy Merlin ne demek? Entrust ve Confide, Zizaco tarafından yazılmıştır [link] (https://github.com/Zizaco/confide) –

+0

Eloquent, Query Builder'ın üstüne gelir ve verileri sınıf örneklerine ayrıştırır.Bu her zaman Query Builder'ı kullanmaktan daha yavaş olacaktır. Eloquent sonuçlarını önbelleğe alabilirsiniz: "Organizasyon :: all() -> hatırla (5);". – assertchris

2

Testler arasında MySQL sorgu önbelleğinizi temizlemek için QUERY CACHE'YE SIFIRLAYIN. Gönderdiğiniz zaman damgalarından, ilk olarak Eloquent sorgularını yaptığınız anlaşılıyor. Bu, ikinci testi yaptığınız zaman muhtemelen önbelleğe alındığı anlamına geliyor. Bu büyük performans farklılığını açıklar, ancak Eloquent'in ek yük yüzünden normal Laravel sorgularından biraz daha yavaş olduğundan şüphelenirim. Eğer DB::table('t_organisations')->get(); yaptığınızda

2

Bir dizi (veya nesneler) gibi tüm sonuçları alan ancak modele bunları hidrat etmez. Hızlı bir açıklama istiyorsanız, this stackoverflow answer'a bakın.

Eğer hidratasyon süreci talebi uzun sürer neden (eğer bellekte tüm nesneleri ayırmak ve alanları ile bunları doldurmak zorunda) olan gerçekleşir Organisation::all(); yaptığınızda. Veritabanınızı daha iyi bir şekilde kullanmanıza yardımcı olmak ve ihtiyacınız olmadığında nesnelerin hidrasyonunu önlemek için hidrasyon optimizasyonunda birçok bağlantı/tut vardır.