2013-07-09 10 views
5

Właśnie testowałem wydajność Eloquent ORM w Laravel i byłem zszokowany, gdy znalazłem proste zapytanie, które trwało ponad 3 sekundy, w porównaniu do normalnego zapytania Laravel, które zakończyło się w 0.1 sekundy. Zwracam tylko 1500 płyt.Eonquent ORM Performance

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

Z pewnością nie może to być normalne !? Nie sądzę, abym pominął cokolwiek w konfiguracji. Moja db jest znormalizowana. Jaki może być problem?

+0

Osobiście poprowadziłbym to przez XDebug, aby zobaczyć, gdzie jest czas marnotrawstwa. –

+1

Czy masz jakieś relacje zdefiniowane w twoim modelu? Jeśli tak, to - Eonquent musiałby wykonać wiele sprzężeń ... – Laurence

+0

Zawsze jest coś, co najlepiej będzie wykorzystać Query Builder, szczególnie w przypadku dużych zbiorów danych. – crynobone

Odpowiedz

2

Dzięki za wszystkie odpowiedzi.

Oto wynik dziennika zapytań MySQL:

Organizacji :: wszystkie(); - 1.6772060394287 sek

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 :: stołowe ('t_organisations') -> get(); - 0.13963603973389 sek

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 

więc żadnej różnicy tam wtedy .... co oznacza opóźnienie musi leżeć w wymowny kodu php. Tak, mam zainstalowany xdebug i nie jestem gotowy zmarnować mojego czasu, próbując dowiedzieć się, dlaczego jest wolny !!! Jeśli jest szybciej w konstruktorze zapytań, to mi wystarczy!

Twórcy @Laravels: świetna robota w ramach. Jest to intuicyjne, dobrze radzi sobie z autoryzacjami, szczególnie z confide i zaufaniem wtyczek od Leroy Merlin. Być może zechcesz jednak rzucić okiem na Eroquent Performance!

Pozdrawiam! Craig

+0

Co masz na myśli Leroy Merlin? Entrust and Confide zostały napisane przez Zizaco [link] (https://github.com/Zizaco/confide) –

+0

Eonquent znajduje się na górze Konstruktora kwerend, analizując dane, które zwraca do instancji klasy.To zawsze będzie wolniejsze niż przy użyciu tylko Query Builder. Możesz buforować wyniki Eloquent za pomocą: "Organization :: all() -> remember (5);". – assertchris

2

Upewnij się, aby wykonać RESET QUERY CACHE, aby wyczyścić pamięć podręczną zapytań MySQL między testami. Z opublikowanych znaczników czasu wynika, że ​​najpierw wykonano kwerendy wymowne, co oznacza, że ​​prawdopodobnie zostały one buforowane przed wykonaniem drugiego testu. To by wyjaśniało ogromną różnicę wydajności, chociaż podejrzewam, że Eloquent jest nieco wolniejszy niż zwykłe zapytania Laravel ze względu na dodatkowe obciążenie.

2

Po wykonaniu tej czynności DB::table('t_organisations')->get(); Pobiera wszystkie wyniki jako tablicę (lub obiekty), ale nie nawilża ich do modelu. Zobacz this stackoverflow answer, jeśli chcesz uzyskać szybkie wyjaśnienie.

Kiedy robisz Organisation::all(); Proces nawodnienie odbywa, dlatego wniosek trwa dłużej (trzeba przeznaczyć wszystkie obiekty w pamięci i wypełnić je z pól). Istnieje wiele linków/wskazówek dotyczących optymalizacji nawodnienia, które pomogą Ci lepiej zażądać bazy danych i unikniesz nawodnienia obiektów, gdy ich nie potrzebujesz.