2013-05-22 3 views
0

mamp v2.1.3에서 로컬로 실행되는 Cake Application v2.3.1 (myapp.dev : port의 최신 버전 임)과 저는 정말 느린 응답을 경험하고 있습니다. 내가 AppController.php이처럼 내 매김 https://github.com/slywalker/TwitterBootstrap의 트위터 부트 스트랩 플러그인을 사용CakePHP에서 Mamp가 매우 느림

public $paginate = array(
     'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'), 
     'limit' => 50, 
     'order' => array('Artist.id' => 'desc') 
    ); 

:

public $helpers = array('Paginator' => array('className' => 'TwitterBootstrap.BootstrapPaginator')); 

I 사이트 (약 5 초)에 페이지 매김 이곳 컨트롤러에 내 코드는 페이지 매김의 limit을 1로 설정하려고 시도했으나 시도했습니다. 부트 스트랩 대신에 케이크 자체의 페이지 매김을 사용하지만, 여전히 느립니다. 나는 myapp.dev:port/artists/view/14532와 같은 아티스트에 접근 할 수 있기 때문에 페이지 매김이되어야한다. 그리고 그것은 잘 작동하므로 SQL 쿼리와 관련이 없다고 생각한다.

나는/etc/hosts 파일 127.0.0.1 localhost myapp.dev::1 localhost myapp.dev에서 이름을 바꾸려고했지만 아무 것도 작동하지 않는 것 같습니다. 어떤 아이디어? 나는 정말로 붙어있다.

업데이트 : 내 아티스트 테이블에있는 hasMany 관계에 대해 언급하지 않는 것이 좋지 않습니다. 이것은 내 아티스트 모델 :

class Artist extends AppModel { 

    public $hasMany = array(
     'ArtistBiography' => array('dependent' => true), 
     'ArtistSurname' => array('dependent' => true), 
     'ArtistSignature' => array('dependent' => true), 
     'ArtistForename' => array('dependent' => true), 
     'ArtistMonogram' => array('dependent' => true)); 
    public $hasOne = array(
     'ArtistActive' => array('dependent' => true)); 
} 

내가 DebugKit을 사용하고 난 매기기 두 왼쪽 2 불필요한 querys을한다는 것을 발견 모두 각각 실행하기 위해 약 2000 밀리 소요 결합한다. 페이징 담당자에게 이것을 무시하도록 어떻게 알 수 있습니까? 나는 이와 같은 새로운 관계를 맺기 위해 노력했다 :

public $paginate = array(
     'fields' => array('Artist.id, Artist.year_born, Artist.year_died, Artist.country_born'), 
     'limit' => 50, 
     'order' => array('Artist.id' => 'desc'), 
     'joins' => array(
       array('table' => 'artist_forenames', 'alias' => 'ArtistForename', 'type' `=>  'inner', 'conditions' => array('Artist.id = ArtistForename.artist_id')),` 
       array('table' => 'artist_surnames', 'alias' => 'ArtistSurname', 'type' => 'INNER', 'conditions' => array('Artist.id = ArtistSurname.artist_id'))), 
     'recursive' => -1 
    ); 

그러나 나는이 작업을하는 방법을 모르겠다. 내가 원한다면 기본적으로 artist_surnamesartist_fornames에 가입하고 artist.activesartist_monogram이라는 두 테이블을 모두 무시하면 4000ms의 쿼리 속도가 느려집니다.

두 번째 조인이 왜 그렇게 느려지는지 두 번째 질문은 여기에 있습니다. 나는 100 명의 아티스트를리스트하고있는 곳의 아티스트/모두라는 테스트 뷰를 만들었고 모든 조인이 포함 된 쿼리는 약 40-50ms 내에 완료되었습니다.

+0

DebugKit을 사용하면 실제로 오래 걸리는 내용을 확인할 수 있습니다.타이머 탭과 Sqllog 탭을 보여줍니다. 알고 계시면 알려주세요.보다 쉽게 ​​도움을받을 수 있습니다. – Dave

+0

Hey Dave, DebugKit을 사용하고 질문을 업데이트했습니다. 감사합니다 – bangerang

답변

3

TLDR :

  1. 설정 $recursive
  2. 사용 CakePHP's Containable Behavior-1 만하면 코드의

예하고자하는 관련 데이터를 검색 :

//wherever you set this variable 
$paginate = array(
    'recursive' => -1, 
    'limit' => 50, 
    'order' => array('Artist.id' => 'desc'), 
    'contain' => array(
     'ArtistSurname', 
     'ArtistForName' 
    ) 
); 
,369을

이 함유 성에 대한 문서를 통해보고 기억 - 당신이 등 등 ... 난 사실에 public $recursive=-1'public $actsAs =array('Containable'); 모두를 설정하는 것이 좋습니다

을 함유 성 $actsAs에 모델 (들)을 설정 -1로 재귀 설정 방법을 설명합니다 귀하의 AppModel - 그런 식으로 모든 모델을 설정하고 언제든지 Containable로 갈 준비가됩니다. 또한 재귀 적으로 -1보다 높은 값은 나쁜 IMHO입니다. Containable은 모든면에서 훨씬 뛰어납니다.

+0

데이브 감사합니다, 그랬어! 하지만 재귀 적으로 설정하지 않아도됩니다. 쿼리가 페이징 작업자에서 오랜 시간이 걸리나 모든 것이 제대로 작동하는 이유는 무엇입니까? – bangerang

+0

내 게시물을 편집하는 동안 인터넷이 끊어 졌으므로 허용 한 답이 무엇인지 잘 모르겠습니다. 내 버전이 맞길 바랍니다. – Dave

+0

느린 것에 대한 제 가정은 테이블 인덱싱의 부족 또는 잘못된 것입니다. – Dave