[질문] 글 보기에서 이전글 다음글 추출 때문에 게시글 보기 속도가 느림 > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

[질문] 글 보기에서 이전글 다음글 추출 때문에 게시글 보기 속도가 느림 정보

[질문] 글 보기에서 이전글 다음글 추출 때문에 게시글 보기 속도가 느림

본문

게시물 건수가 작을 때는 몰랐는데
어느 순간 특정 게시판이 느려졌다 싶었어요.
그래서 다른 게시판을 보니 빠르더군요.
원인은 느린 게시판은 글 수가 4만 건이 넘고 빠른 게시판은 몇 천 건이더군요.

그래서 여기 저기 실행 속도 검사를 해 보고 원인이 있는 곳을 찾았습니다.

/bbs/view.php의 소스에 실행 시간을 검사하는 코드를 넣었습니다.
아래는 소스의 일부입니다.
==================================================

    // 아래글을 얻음
    $sql = " select wr_id, wr_subject, wr_datetime from $write_table where wr_is_comment = 0 and wr_num = '$write[wr_num]' and wr_reply > '$write[wr_reply]' $sql_search order by wr_num, wr_reply limit 1 ";
    $next = sql_fetch($sql);
    // 위의 쿼리문으로 값을 얻지 못했다면
    if (!$next[wr_id]) {
////////////////////////////// 여기에 넣고
echo ("\n<!-- exec time : ". (get_microtime() - $begin_time) . "--->\n");
        $sql = " select wr_id, wr_subject, wr_datetime from $write_table where wr_is_comment = 0 and wr_num > '$write[wr_num]' $sql_search order by wr_num, wr_reply limit 1 ";
        $next = sql_fetch($sql);
///////////////////////////// 여기에도 넣고
echo ("\n<!-- exec time : ". (get_microtime() - $begin_time) . " ( $sql ) --->\n");
    }

=========================
sql문을 보면

select wr_id, wr_subject from g4_write_myboard where wr_is_comment = 0 and wr_num > '-42817'  order by wr_num, wr_reply limit 1

여기서
    order by wr_num, wr_reply
요넘 때문에 속도가 느린 것 같아요.
이걸 뺴고 쿼리를 날리면 0.000얼마 걸리는데
저 상태는 0.7초 가량 걸립니다.
글 조회할 때 0.7초는 세월이거든요...

인덱스를 새로 추가해 보았으나 마찬가지였습니다.
인덱추가 wr_num 하나만
인덱추가 wr_reply 하나만
인덱추가 wr_num, wr_reply 합쳐서
인덱추가 wr_num, wr_id 등등등
여러가지로 인덱스를 잡아도 속도가 나아지지 않네요.

다음은 mysql의 explain 값입니다.
id 1
select_type SIMPLE
table g4_write_myboard
type ref
possible_keys wr_num_reply_parent,wr_is_comment
key wr_is_comment
key_len 1
ref const
rows 42799
Extra Using where; Using filesort

/etc/my.cnf 에서 sort buffer 크기 키워 보기도 했지만 속도 향상 안 되네요.

이렇게 시간을 많이 잡아 먹는데, 좋은 해결 방안이 없을까요?
경험이 있으시거나 해결 방안이 있으신 분들의 조언을 부탁 드려 봅니다.
감사합니다.

댓글 전체

=== 자답입니다 ===

아래글을 얻는 쿼리 두 번째 것을 수정했습니다.

// 위의 쿼리문으로 값을 얻지 못했다면
 $sql = " select wr_id, wr_subject, wr_datetime from $write_table where wr_is_comment = 0 and wr_num > '$write[wr_num]' $sql_search order by wr_num, wr_reply limit 1 "; 

이 부분을 수정했습니다.

먼저 is_comment에 무관하게 자료를 추출한 후 is_comment=0 인 넘만 골라 내면 훨씬 빠릅니다.
다음과 같이 개선했습니다.

$sql = " SELECT * FROM (
  select wr_id, wr_subject, wr_is_comment, wr_num, wr_reply from $write_table where wr_num > '$write[wr_num]' $sql_search order by wr_num, wr_reply limit 2000
) Z WHERE wr_is_comment=0 
ORDER BY wr_num, wr_reply LIMIT 1";
        $next = sql_fetch($sql);

먼저 is_comment 걸르지 말고 2000 개 추출한 다음....
(어차피 comment가 2000개는 안 될 거라 믿고...)
그 중에서 comment 아닌 넘을 골라 내어 ORDER BY 하면
결과가 훨씬 빠르게 나옵니다.
0.7초 걸리던 것이
0.02초에 해결됩니다.

도움이 되시길...
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT