2017-12-04 14 views
-1

저는 Google PageSpeed ​​Insights를 사용하여 웹 사이트의 성능을 분석해 왔습니다.보고하는 주된 문제는 평균 서버 응답 시간이 1.5-2 초 정도 인 것입니다. Google은 200ms를 달성 할 것을 권하고 있습니다.느린 페이지 속도를 야기하는 중간 텍스트를 사용하여 성능 문제가 발생했습니다.

데이터베이스에서 데이터를 검색하는 쿼리가 성능상의 심각한 문제를 일으키는 것으로 밝혀졌습니다. 내 웹 사이트는 캐싱을 광범위하게 사용하여 웹 사이트의 섹션을 검색합니다. 전체 웹 페이지는 일반적으로 캐시 테이블에서 5 개의 데이터베이스 쿼리로 생성 할 수 있습니다.

내가 하드 코딩이 내 반환 값은 (주 선택 '이 테스트입니다') 때 :

$sql = "SELECT 'This is a test' 
     FROM cache 
     WHERE url = ? 
     AND language = ? 
     AND currency = ?"; 
$stmt = $conn->prepare($sql); 
if (!$stmt) { 
    ThrowDBError($conn, $stmt, $sql); 
} 
$stmt->bind_param('sss', $url, $language, $currency); 
if (!$stmt->execute()) { 
    ThrowDBError($conn, $stmt, $sql); 
} 
$stmt->bind_result($cache); 
$stmt->fetch(); 
$stmt->close(); 

서버 응답 속도가 0.5 초에 떨어진다. - 웹 사이트가 캐시 테이블을 만드는 쿼리 5에 대한 이초

$sql = "SELECT page_body 
     FROM cache_copy 
     WHERE url = ? 
     AND language = ? 
     AND currency = ?"; 

$stmt = $conn->prepare($sql); 
if (!$stmt) { 
    ThrowDBError($conn, $stmt, $sql); 
} 
$stmt->bind_param('sss', $url, $language, $currency); 
if (!$stmt->execute()) { 
    ThrowDBError($conn, $stmt, $sql); 
} 
$stmt->bind_result($cache); 
$stmt->fetch(); 
$stmt->close(); 

서버 응답 시간이 1.5 일관 점프 :이 같은 실제 데이터 열 page_body을 선택하는 데 다시 넣어합니다.

캐시 테이블에는 8,000 개의 행만 포함되어 있으며 올바르게 색인을 생성했다고 생각합니다. page_body 열은 중간 텍스트입니다. 중간 텍스트를 사용하여 성능 관련 문제를 아는 사람이 있습니까? 로드 시간에 1.5 초를 추가하는 이유를 모르겠습니다.

CREATE TABLE `cache` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `url` varchar(255) NOT NULL, 
    `language` varchar(2) NOT NULL, 
    `currency` varchar(3) NOT NULL, 
    `page_body` mediumtext NOT NULL, 
    `cached_time` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `url, language, currency` (`url`,`language`,`currency`) USING BTREE, 
    KEY `cached_time` (`cached_time`) USING BTREE 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

어떤 아이디어 : 여기

캐시 테이블에 대한 DDL입니까? 많은 감사합니다

+0

5 개의 쿼리를 실행하여 1 페이지를 생성해야한다면이 길게 걸리는 것이 합리적입니다. 코드에는 아무 문제가 없지만 캐싱에 대한 잘못된 접근 방법이 사용됩니다. 내 경험에 의하면 캐싱은 웹 서버에서 수행되며 클라이언트간에 공유 .. DB 쪽보기에서 자동으로 쿼리를 캐시하는 데 사용됩니다 .. 가끔은 당신이 웹 서버에 높은 CPU를 볼로드 ballancer를 사용해야합니다 .. 최적화는 프런트 엔드 js/CSS/이미지 브라우저 gzip을 통해입니다 압축 및 캐싱 .. 또한 확인해보십시오 https://stackoverflow.com/a/7875699/3254405 – numbtongue

+0

답장을 보내 주셔서 감사합니다. 내 OP에서 하드 코딩 된 텍스트 ('This is a test')를 반환하는 5 개의 쿼리를 테스트했으며 응답 시간과 아무런 차이가 없었습니다. 이 문제는 쿼리 자체를 수행하는 오버 헤드가 아닌 실제 데이터를 반환하는 것으로 보입니다. 이 문제는 테이블에서 '실제'데이터를 가져 오는 것 같습니다. – BigMeaty

+1

추가 테스트로서 리뷰 주석에 varchar (1000)를 사용하는 리뷰를 저장하는 데 사용 된 테이블을 복제했습니다. 중복 테이블에서 유형을 중간 텍스트로 변경합니다. varchar로 빠른 응답, 중간 텍스트로 느리게. 문제는 확실히 데이터 유형으로 mediumtext를 사용하는 것으로 보입니다. – BigMeaty

답변

0

얼마나 많은 행을 반환합니까? 단 1 행만 반환하는 경우 200ms 미만이어야합니다.

오! 문제가 보이니. 당신은 MyISAM을 사용하고 있습니다. 하지마. InnoDB로 전환하십시오.

실제 테이블이 cache 인 경우 사실상 동일한 속도를 얻게됩니다. 네가 캐시를 없애기 바란다.

+0

문제는 mysqli의 알려진 제한 사항으로 인해 여기에 설명되어 있습니다. https://bugs.php.net/bug.php?id=51386 해결 방법은 다음과 같이 store_result()를 사용하는 것입니다. if (!$ stmt-> execute()) { ThrowDBError ($ conn, $ stmt, $ sql); } $ stmt-> store_result(); $ stmt-> bind_result ($ cache); – BigMeaty