2013-07-09 3 views
5

저는 Laravel에서 Eloquent ORM 성능을 테스트했으며, 0.1 초 만에 완료된 일반 Laravel 쿼리와 비교하여 3 초 이상 걸리는 간단한 쿼리를 찾기가 놀랍습니다. 나는 1500 레코드 만 반환합니다.Eloquent ORM 성능

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

은 확실이 정상이 될 수 없습니다!? 나는 셋업에서 무엇이든 놓친 적이 없다고 생각한다. 내 DB가 정상화되었습니다. 무엇이 문제 일 수 있습니까?

+0

개인적으로 시간 낭비가있는 곳을보기 위해 XDebug를 실행했습니다. –

+1

모델에 정의 된 관계가 있습니까? 그렇다면 Eloquent는 많은 조인을해야 할 것입니다 ... – Laurence

+0

대용량 데이터를 처리 할 때 특히 Query Builder를 사용하는 것이 가장 좋습니다. – crynobone

답변

2

모든 답장을 보내 주셔서 감사합니다. 여기

는 MySQL의 쿼리 로그의 결과이다 :

기구 :: 모든(); - 1.6772060394287 초

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 :: 표 ('t_organisations') -> (GET); - 0.13963603973389 초

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 

그래서 설득력 PHP 코드에 거짓말을해야하는 지연을 의미가 다음 차이가 없습니다 .... 예, xdebug가 설치되어 있고 아무런 이유없이 느려지는 것을 알아 내려고 노력하는 시간을 낭비 할 준비가되어 있지 않습니다 !!! 쿼리 빌더가 빠르면 나에게 충분하다 !!

@Laravels '개발자 : 프레임 워크에서 훌륭하게 작동합니다. 직관적이며 권한 부여를 잘 처리합니다. 특히 Leroy Merlin의 신임 및 위임 플러그인이 좋습니다. 당신은 Eloquent performance issue를 보길 원할 것입니다 !!

건배! 크레이그

+0

리로이 멀린 무엇을 의미합니까? Entrust 및 Confide는 Zizaco [link] (https://github.com/Zizaco/confide) –

+0

에 의해 작성되었습니다. Eloquent는 Query Builder 위에 위치하여 클래스 인스턴스로 반환되는 데이터를 구문 분석합니다.쿼리 작성기를 사용하는 것보다 항상 느립니다. Eloquent 결과는 "Organization :: all() -> remember (5);"로 캐싱 할 수 있습니다. " – assertchris

2

테스트 사이에 MySQL 쿼리 캐시를 지우려면 쿼리 캐시 재설정을 수행해야합니다. 게시 한 타임 스탬프에서 Eloquent 쿼리를 먼저 수행 한 것처럼 보입니다. 즉, 두 번째 테스트를 수행 할 때까지 캐싱 된 것 같습니다. 그것은 엄청난 성능 차이를 설명 할 것입니다. 비록 추가 오버 헤드로 인해 일반 Laravel 쿼리보다 느린 것으로 느껴집니다.

2

할 때 DB::table('t_organisations')->get(); 모든 결과를 배열 (또는 개체)로 가져 오지만이를 모델에 수화하지 않습니다. 간단한 설명을 원할 경우 this stackoverflow answer을 참조하십시오.

당신이 수화 프로세스는 요청이 오래 걸리는 이유 (당신은 메모리에 모든 개체를 할당하고 필드를 채워야) 인 발생 Organisation::all(); 할 때. 수화 최적화에 대한 많은 링크/잣대가있어 데이터베이스를 더 잘 요청하고 필요없는 경우 물체의 수분을 피할 수 있습니다.