2014-01-28 4 views
3

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이로드되어 결과를 필터링 할 때 발생했습니다. 잘만되면 왜 케이크가 제대로 수행되지 않는지에 대한 이유를 찾는 다른 누구도 애플리케이션 및 플러그인 모델의 콜백을 살펴볼 것입니다.

+0

ralationship은 단지 메시지 belongsTo 수신자입니까? – arilia

+0

메시지가 Sender, Recipient 및 MassMessage에 속합니다. 나는 오늘 아침 약 1 시간 동안 이것을 디버깅 해왔고 너무 오랜 시간이 걸리는 것을 알아 냈습니다. 나는 아직 이유를 알지 못했습니다. 나는 내가 더 많이 알게되면 바로 이것을 업데이트 할 것이다. – mneil

+0

나는 동일한 문제점에 직면하고있다.나는 Paginator 구성 요소가 전체 카운트를 필요로하고'WHERE 1 = 1'로 쿼리를 만들고 나서'limit'에 따라 페이지 매김을합니다. – zeflex

답변

0

나는 천천히 돌아갈 이유가 없습니다.

이렇게하면 추가 처리를 수행하고 작업 시간을 너무 많이 늘리는 콜백 (모델 또는 컨트롤러에 설치됨)이 있음을 알 수 있습니다.

컨트롤러에 다른 것은 없지만 사용자가 작성한 내용이 있다고 가정합니다.

당신은 실제로 페이지 넘김의 measure the time을 호출 할 수 있으며 매우 빠르다고 느낄 것입니다. 병 목은 코드의 다른 부분에 있습니다.

추신 : 잠시 동안 DebugKit을 사용하지 않도록 설정할 수도 있습니다. 어떤 특정한 경우에는 내성 검사가 매우 오래 걸릴 수 있습니다.

+0

"DebugKit을 설치했습니다"라는 질문에 두 번째 문장이 있습니다. 이 코드는 컨트롤러 동작 전체입니다. 나는이 모든 것을 쓰지 않았고, 어딘가에 숨겨진 콜백이 있을지도 모른다. 나는 또한 그것을 점검하고 이것을 업데이트 할 것이다. 감사합니다. – mneil

+0

DebugKit이 설치되어 있으며 쿼리 및 작업 시간을 측정 한 것으로 나타났습니다. 내가 제안한 것은 수동으로 페이징 시간을 측정하는 것이었다. 거의 즉각적이므로 일부 콜백이 있음을 알 수 있습니다. DebugKit을 사용하지 않으려 고합니다. 그게 어떻게되는지 봅시다. 내가 찾은 골동품입니다! –

+0

(DebugKit이 실제로 동작 시간을 측정하는 방법을 모르므로 제안합니다.) –

0

응용 프로그램에 DebugKit을 설치하십시오.

그리고 어떤 쿼리가 너무 오래 걸리는지 검사하십시오. 거기서부터 병목 상태를 추적 할 수 있어야합니다.

+0

DebugKit이 설치되어 있습니다. 나는 이것을 downvote 것이다. 그러나 나는 그렇게하는 평판을 가지지 않고있다. 쿼리가 SLOW가 아닙니다. 2ms. – mneil