로드하는 데 37 초가 걸리는 페이지가 있습니다. 로드하는 동안 MySQL의 CPU 사용량이 지붕을 통해 고정됩니다. 이 페이지의 코드를 작성하지 않았으므로 병목 현상의 원인이 쉽게 알 수 없으므로 다소 복잡합니다.PHP 페이지 최적화 : MySQL 병목 현상
(kcachegrind를 사용하여) 프로파일을 작성하고 페이지에서 대부분의 시간이 MySQL 쿼리를 수행하는 데 소요되는 시간의 90 %가 25 개의 서로 다른 mysql_query 호출에 사용되었습니다.
쿼리는의 형태를 취할하여 tag_id는 25 개 가지 통화의 각 변화와 함께 다음 각 쿼리는 좋은 측정을 위해 던진 몇 가지 이상 지연으로 완료하는 데 약 0.8 초가 걸립니다
SELECT * FROM tbl_news WHERE news_id IN (select news_id from tbl_tag_relations WHERE tag_id = 20)
... 따라서 페이지를 완전히로드하는 데 37 초가 소요됩니다.
제 질문은 문제의 원인이되는 중첩 된 선택을 사용하여 쿼리를 서식 지정하는 방식입니까? 또는 그것이 백만 가지 다른 것 중 하나 일 수 있습니까? 이 느린 문제를 해결하는 방법에 대한 조언을 주시면 감사하겠습니다.
쿼리에 EXPLAIN을 실행하면이 문제가 발생합니다 (하지만이 결과의 영향에 대해서는 명확하지 않습니다 ... 기본 키의 NULL이 나쁜 것처럼 보입니다. 반환되는 결과의 수가 나뿐만 아니라 결과의 소수만이 반환됩니다.)
1 PRIMARY tbl_news ALL NULL NULL NULL NULL 1318 Using where 2 DEPENDENT SUBQUERY tbl_tag_relations ref FK_tbl_tag_tags_1 FK_tbl_tag_tags_1 4 const 179 Using where
tbl_news 및 tbl_tag_relations 테이블에 인덱스를 게시 할 수 있습니까? Explain에는 색인이 사용되지만 구성 요소는 사용되지 않습니다. 나는 이것이 '누락 된 인덱스'문제라고 생각한다. (25 개의 개별 쿼리를 실행해도 좋지 않다.) –
당신이 맞았다. 조나단. 누락 된 색인 문제였습니다. Cletus는 어느 것을 제안하고 그의 제안은 10 배의 속도 향상을 가져왔다. – Stuart