cakephp 응용 프로그램이 2.4이고 Paginator 구성 요소에 문제가 있습니다. 첫째, 데이터베이스가 아니며 쿼리 결과를 구문 분석하는 것이 분명합니다. DebugKit이 설치되어 있고 페이지가 매겨진 데이터에 대한 mysql 쿼리에 전체 2ms가 걸리는 것을 볼 수 있습니다. 이 테이블에는 250 만 개의 메시지 레코드와 50 만 명의 사용자가 있습니다. 분명히 적절한 인덱싱이 제 위치에 있습니다. 그러나 컨트롤러 동작은 6167.82ms가 소요됩니다. 그래서, 내 컨트롤러 동작은 다음과 같습니다.cakephp paginator 매우 느림
$this->Paginator->settings = array(
'Message' => array(
'fields' => array(
'Recipient.username',
'Recipient.profile_photo',
'Recipient.id',
'Message.*'
),
'joins' => array(array(
'table' => 'users',
'alias' => 'Recipient',
'type' => 'LEFT',
'conditions' => array(
'Recipient.id = `Message`.`recipient_id`'
)
)),
'conditions' => array(
'Message.sender_id' => $this->Auth->user('id'),
'Message.deleted_by_sender' => '0'
),
'limit' => 10,
'order' => 'Message.id DESC',
'recursive' => -1
)
);
$sents = $this->Paginator->paginate('Message');
$this->set('sents', $sents);
$this->view = 'index';
저는 이것을 검색하여 스택 오버플로를 검색했습니다. 응답의 대다수는 나의 경우가 아닌 가난한 mysql 최적화를위한 것이다. 나머지 절반은 수용 가능하다고 제안했다. 그래서, 나는 수용 할 수있는 노력했다. 실제로 사용자 이름, 사진 및 ID보다 사용자의 입력란에서 더 많은 데이터를 가져 오려고했기 때문에 포함을 사용하는 것이 실제로 속도가 느립니다. 그런 다음 cake가 질의 결과에서 배열을 만들었을 때 나는 여분의 사용자 데이터가 있다고 가정하기 때문에 containable과 함께 거의 500ms 더 느리게 실행했습니다.
이제는 Paginator 구성 요소를 살펴보고 응답을 작성하는 데 너무 오래 걸리는지 확인합니다. 나는 누군가가 나를 때리고 그 속도를 높이는 좋은 해결책이 있기를 바라고 있습니다.
내 웹 서버는 3gb 램, apache 및 apache가 설치된 mod_php와 함께 우분투 12.04를 실행 중이고 모델 및 코어 캐시에서 작동합니다. 데이터베이스가 별도의 서버에 있습니다. 나 또한 다른 사용자 데이터와 케이크 세션 데이터를 유지하는 redis 서버가 있습니다. 약 12 개의 행을 포함하는 mysql 쿼리에서 10 개의 레코드를 파싱 할 수있는 강력한 기능이 있습니다.
편집 : 답변
으로는이 페이지 매김을 둔화되었고, 뭔가 다른 일이 같은 콜백으로, 거기 일리 Pandia에 의해 처음으로 제안했다. 이것은 실제로 페이지 매김 구성 요소와 관련이 없습니다. 받는 사람 모델에는 타사 서비스의 설치 콜백에 sdk를로드하는 동작이있었습니다. 그 서비스는 반응하는데 수초가 걸렸습니다. 이것은 쿼리의 linkedModel이로드되어 결과를 필터링 할 때 발생했습니다. 잘만되면 왜 케이크가 제대로 수행되지 않는지에 대한 이유를 찾는 다른 누구도 애플리케이션 및 플러그인 모델의 콜백을 살펴볼 것입니다.
ralationship은 단지 메시지 belongsTo 수신자입니까? – arilia
메시지가 Sender, Recipient 및 MassMessage에 속합니다. 나는 오늘 아침 약 1 시간 동안 이것을 디버깅 해왔고 너무 오랜 시간이 걸리는 것을 알아 냈습니다. 나는 아직 이유를 알지 못했습니다. 나는 내가 더 많이 알게되면 바로 이것을 업데이트 할 것이다. – mneil
나는 동일한 문제점에 직면하고있다.나는 Paginator 구성 요소가 전체 카운트를 필요로하고'WHERE 1 = 1'로 쿼리를 만들고 나서'limit'에 따라 페이지 매김을합니다. – zeflex