안녕하세요
운영중인 사이트의 게시물에 댓글이 많아지니 게시물을 읽어들이는 속도가 저하되는 문제가 있습니다.
생각보다 문제가 심각해서 댓글은 50개 가량인데, 게시물을 읽어들이는데 5초이상이 걸리더라구요
(참고로 댓글 1-2개인글은 1초미만으로 굉장히 빠르게 잘 읽어들입니다)
정확한 원인분석을 위해 개발자도구로 살펴봤더니, 용량이 큰 이미지나 css등의 요소는 없고 순전히 php로직이 돌면서 응답을 늦게 쏴주는거더라구요.
그런데 어느부분을 수정해야할지 도저히 모르겠는게..
아래 사이트를 참고하여 의심되는 부분 앞뒤로 소요시간을 보았는데
view.skin.php파일의 코멘트 입출력부분을 위/아래로 감쌌을땐 소요시간이 5초라고 나왔거든요.
(아래 코드를 감싼부분)
<?php
// 코멘트 입출력
include_once(G5_BBS_PATH.'/view_comment.php');
?>
그래서 view_comment.php에서 어떤 요소가 시간을 잡아먹는지 봐야겠다고 살펴봤는데
이 코드 자체는 소요시간이 얼마 안되더라구요?
심지어 view_comment.php의 제일 윗부분과 제일 아랫부분을 microtime으로 시간을 측정해보았더니 소요시간은 0.01초라고 뜹니다;;
그러면 include_once를 하는 과정에서 무언가 속도를 저하시키는걸까요?
제 추측으로는 view_comment.php의 for문이 돌면서 속도를 저하시키는것같은데, 그 for문안에 어떤 코드가 문제인지를 파악하고싶었거든요.. 그 방법에대해서도 궁금합니다
추가로 좀 특이한건..
댓글이 50개인 글이 5초가 걸린다치면
일시적으로 view_comment.php의 for문의 반복을 2회로 제한했을때(즉, 댓글이 2개만 보이게)
읽어들이는 시간이 줄어들어 빨라질거라 예상을 했는데 예상과 반대로 역시 5초가 걸리는 상태입니다
도움좀 부탁드립니다
답변 8개
원인, 또는 원인지점을 정확하게 찾아야.. 그에 맞는 해결책이 나옵니다.
1차로
include_once(G5_BBS_PATH.'/view_comment.php');
를 뺐을 때 속도지연 현상이 없는지 살펴볼 수 있고..
속도지연 현상이 있다면..
해당 부분에서 select 쿼리 부분을 출력하여 DB 에 직접 실행했을 때.. 몇 초 걸리는 지 측정해 볼 수 있습니다.
& view_comment.php 에서 특정구간 마다 exit; 코드 삽입으로 속도지연 구간 체크
이런 작업들을 통해 원인 또는 원인지점을 정확하게 찾는 것이 가장 중요합니다.
댓글, 전체 게시물 갯수 어느정도인가요?
bbs/"view_comment.php"에 보면
// 코멘트 출력
//$sql = " select * from {$write_table} where wr_parent = '{$wr_id}' and wr_is_comment = 1 order by wr_comment desc, wr_comment_reply ";
$sql = " select * from $write_table where wr_parent = '$wr_id' and wr_is_comment = 1 order by wr_comment, wr_comment_reply ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++)
{ ...
이런 부분이 있는데
show index from g5_write_notice;
+-----------------+------------+---------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------+------------+---------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| g5_write_notice | 0 | PRIMARY | 1 | wr_id | A | 0 | NULL | NULL | | BTREE | | |
| g5_write_notice | 1 | wr_num_reply_parent | 1 | wr_num | A | NULL | NULL | NULL | | BTREE | | |
| g5_write_notice | 1 | wr_num_reply_parent | 2 | wr_reply | A | NULL | NULL | NULL | | BTREE | | |
| g5_write_notice | 1 | wr_num_reply_parent | 3 | wr_parent | A | NULL | NULL | NULL | | BTREE | | |
| g5_write_notice | 1 | wr_is_comment | 1 | wr_is_comment | A | NULL | NULL | NULL | | BTREE | | |
| g5_write_notice | 1 | wr_is_comment | 2 | wr_id | A | NULL | NULL | NULL | | BTREE | | |
+-----------------+------------+---------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
6 rows in set (0.00 sec)
막상 index를 보면
이용할 수 있는 index key가 없습니다.
wr_parent가 들어 가는 인데스를 하나 더 만들어 보시기 바랍니다.
wr_is_comment(wr_is_comment,wr_id) 이 인덱스 키에서
wr_id 대신 wr_parent를 넣어 보시는 것도 좋을 듯합니다.
해당 게시판에 누적된 데이터가 많아
해당 쿼리 질의 자체가 오래 걸리는것으로 보이네요.
질의 할때 WHERE절에 입력된 조건 등이 있을텐데 해당 컬럼을 인덱스로 지정하시거나,
그래도 문제가 된다면 별도의 캐시를 이용하시거나 등 db 질의 후 얻어오는 데이터 속도 자체를 개선하셔야 합니다.
일반적으로 시스템적으로 개선이 어려운 사이트에서는 db에 일정한 데이터가 쌓이면 새로 db를 개설하여 (구)게시판으로 남겨 볼 수 있게만 해놓고, 새로운 게시판을 만들어 처리하는 경우가 많습니다.
답변을 작성하려면 로그인이 필요합니다.