RadarURL

웹 프로그래밍
2006.03.01 10:44

최근 게시물보기 속도 빠르게 만들기

조회 수 7515 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

가 크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

가 크게 작게 위로 아래로 댓글로 가기 인쇄

최근 게시판 속도 빠르게 하는 방법입니다.

홈페이지에 제로보드 게시판을 이용하여 php 프로그램을 많이 하십니다.
특히 게시물이 많아질 수록 최근 게시물을 로드하는데 시간이 오래 걸림을 많이 느끼시게 될 것입니다.
그 문제를 해결하기 위해 여러가지로 알아 보았더니 원인은 바로 select 문에서 사용하는 order by 에 있었습니다.

예) select * from zetyx_board_free where is_secret=0 and father=0 order by no desc limit 10

order by 에 의해서 게시물이 정렬하는데 걸리는 시간은 n^2 (n 의 제곱) 에 비례합니다.

즉, 게시물이 10 개일 경우 100 에 해당하는 시간이 걸린다면, 게시물이 1000개인 경우 1,000,000 에 해당하는 시간이 걸린다는 것이죠.

실제로 최근 게시물 번호 ( no 필드) 가 4000 번인 게시물의 최근 리스트를 구해오는데 10초넘게 걸린 적도 있었습니다. (한번 구한 다음에는 DB 에 캐시가 저장되어 빠르게 구하지만...)

이런 문제를 해결하기 위해서 가장 최근의 게시물 몇개를 가져와서 그 것에 대해서 order by 를 적용하는 방법으로 속도를 향상 시킬 수 있습니다.

아래의 내용을 적용한 뒤에는 엄청난 효과를 보았습니다. 거의 누르자마자 화면이 뜰 정도의 속도 향상을 가져왔습니다.

제로보드 게시판을 사용하신다면 꼭 적용하셔서 홈페이지 처리속도도 향상시키시고, 서버 부하도 줄여 줍시다.

--------------------------------------------------------------------

outlogin.php 의 print_bbs 함수에 파란 색으로 표시된 부분을 삽입하시면 됩니다.

function print_bbs(...)

...

if($setup[use_alllist]) $target = "zboard.php?id=".$id;
else $target = "view.php?id=".$id;

$result = mysql_query("select * from $t_board"."_$id where is_secret=0 and father=0 order by no desc limit $num", $connect) or die(mysql_error());

----------------------------------------------------------------------

function print_bbs(...)

...

if($setup[use_alllist]) $target = "zboard.php?id=".$id;
else $target = "view.php?id=".$id;

// speed up by hankawi
$tmp = mysql_fetch_array(mysql_query("select max(no) from $t_board"."_$id"));
$max_no = $tmp[0];
if ($max_no > 500) { // 게시물 개수가 500개 이상일때만
$mylimit = $max_no - 100; // 최종 100개를 대상으로
$speedup = "no>$mylimit and";
} else {
$speedup = "";
}

$result = mysql_query("select * from $t_board"."_$id where ".$speedup." is_secret=0 and father=0 order by no desc limit $num", $connect) or die(mysql_error());
//

 

최병덕
  이 부분은 print_bbs 말고도 다른 부분에도 적용이 가능 할까요?
즉, print_survey 또는 print_gallery 에서도 적용이 가능 하도록 수정이 될까요? 2004-12-18
12:02:43
 

 

에지
  최병덕// 똑같이 수정하시면 될겁니다-ㅅ-;; (아마도... 퍽-) 2004-12-18
12:33:33
 

 

KangMin
  참 매력적인 팁이네요.. 감사합니다. 2004-12-18
14:02:41
 

 

김종환
  $result = mysql_query("select * from $t_board"."_$id order by headnum asc, arrangenum asc limit $num", $connect) or die(mysql_error());

인 경우엔 ".$speedup." 부분을 어디에 넣으면 되는지 알려주세요~^^ 2004-12-18
14:08:49
 

 

김훈
  You have an error in your SQL syntax near '=0 order by no desc limit 8' at line 1

저는 위의 에러 메시지만 출력되는 군요. .$speedup. 이부분을 빼면 제대로 나오지만 그러면 아무 소용이 없잖아요? 2004-12-18
17:46:11
 

 

김훈
  아이고...자문 자답입니다.
띄어쓰기가 아주 중요하군요...
"_$id where△".$speedup."△is_ where 와 is 사이에 ".$speedup." 을 넣을때 꼭 한칸씩 띄워주어야 돼네요. 저같이 실수하시는 분이 있을까봐 우문을 남깁니다. 2004-12-18
17:49:26
 

 

방병현
  김종환 // 님의 경우 where 가 없으니 where 를 추가하셔서 넣으셔야 겠군요.
select * from $t_board"."_$id order by headnum asc ...
==>
select * from $t_board"."_$id where ".$speedup." order by headnum asc ...

그리고, and 뒤에 아무것도 없게 되니
$speedup = "no>$mylimit and";
==>
$speedup = "no>$mylimit ";

이 부분에서도 and 를 빼고 하셔야 겠군요. 2004-12-19
22:25:30
 

 

방병현
  최병덕 // order by 로 쿼리를 하는 모든 select 에 대해서 적용하면 효과가 있습니다. 2004-12-19
22:31:33
 

 

김종환
  설명 감사합니다~^^ 제가 해 보니 에러가....
번거로우시겠지만, 복사해서 붙여버리게 한줄로 요약을 부탁드려도 될까요?

'SQL 구문에 오류가 있습니다.' 에러 같읍니다. ('order by headnum asc, arrangenum asc limit 2' 명령어 라인 1) 2004-12-20
00:00:13
 

 

무삶이
  음..좋군요.
홈피 메인 뜨는 속도가 3초 정도 되는 것 같아서..이 팁을 응용해 보았는데..
1초 정도는 단축된 거 같군요.
여러가지 최근게시물을(그것도 웹진형태로...) 만들어 놓고서 속도 때문에
플래시도 압축해보고 소스수정도 해보고,,,여러가지 해보았으나..
역시 최근게시물의 트래픽요인이라고 생각했는데...
이 팁으로 어느 정도 해결이 되어 만족스럽습니다.
추천 한방 꾹! 2004-12-20
15:00:13
 

 

드림퀘스트
  희박한 경우이겠지만 쓰고 지우는 일이 잦은 게시판에서는 no 필드의 구멍때문에 원하는 갯수대로 가져오지 못할수도 있고 100개씩 가져오는것도 낭비일 수도 있겠습니다.
그래서 정확한 갯수대로 가져오려면 no 필드 보다는 headnum이 더 정확할것 같습니다.
headnum으로 가져오려면 아래와 같이 하시면 됩니다.
(테스트는 해보지 않았습니다.)

$tmp = mysql_fetch_array(mysql_query("select min(headnum) from $t_board"."_$id"));
$mylimit = $tmp[0] + $num; // 가져오기로한 게시물 갯수만큼만
$speedup = "headnum<$mylimit and";

$result = mysql_query("select * from $t_board"."_$id where ".$speedup." is_secret=0 and father=0 order by no desc limit $num", $connect) or die(mysql_error()); 2004-12-20
20:37:23
 

 

오혜성
  비밀글하고, 리플글 추출이 안되던데... 어떻게 해야 하나요? 2004-12-20
22:24:49
 

 

teslaMINT
  ' is_secret=0 and father=0' 를 지우세요. 2004-12-21
01:00:49
 

 

오혜성
  is_secret=0 and father=0 이거 지워도 안되서 질문한건뎅...ㅠㅠ
$speedup = "no>$mylimit "; 위 라인 지우구 이렇게 해두.. 마찬가지던데요. 2004-12-21
02:34:53
 

 

채정현
  드림퀘스트님, 그렇게 하면, 공지사항이 있는 게시물의 경우 공지사항만 추출되는 사태가...
ㅡ.ㅡ;; 2004-12-21
19:15:02
 

 

방병현
  드림퀘스트님/

저도 사실 그런 부분이 고민이었습니다. 사실 100개 까지 리스트를 가져올 필요는 없지요. 더 작게 주셔도 상관이 없습니다.

하지만 중간에 삭제가 많이 일어나는 경우 구멍이 생기기 때문에 무난한 숫자로 그냥 100 으로 준 것입니다.

좋은 아이디어 감사합니다. 하지만 중간에 구멍이 생기는 문제는 headnum 으로 해도 똑같이 발생하는 문제이군요. 2004-12-22
23:45:37
 

 

teslaMINT
  $speedup..... 은 지우면 안되는데요. 2004-12-23
09:44:07
 

 

드림퀘스트
  headnum은 중복되는 번호가 생기고 no보다는 덜하지만 간간히 구멍이 있네요.
제가 위에 코멘트에서 언급한 headnum은 사용하시면 안되겠습니다. ^^ 2005-01-05
01:54:18
 

 

제로맨
  헛.... 진짜 빨라져따......*^^* (감사) 2005-08-27
18:23:43
 

 

빛소리
  상쾌해집니다....시원해지고 .... 윤활류 발라진 기계처럼. 감사.... 2005-09-03
10:33:02
 

 

별의카비
  안되는데요 -_-;

출처 : http://www.nzeo.com/bbs/zboard.php?id=cgi_tip&page=9&sn1=&divpage=1&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=6606

?

공부 게시판

공부에 도움되는 글을 올려주세요.

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 [공지] 공부 게시판 입니다. 처누 2003.08.18 1756773
346 응용 프로그래밍 WIndows Application의 실행 속도 측정 file YooN 2023.09.06 6284
345 웹 프로그래밍 메모리 부족 현상 (allowed memory size of 134217728 bytes..) YooN 2023.08.01 5755
344 웹 프로그래밍 Guzzle - cURL error 60: SSL certificate problem: unable to get local issuer certificate 문제 해결 file YooN 2023.07.30 5847
343 웹 프로그래밍 XE 캐시파일 재성생후 404 Oops, Sorry. Page is not found! 나올때 YooN 2023.07.29 5698
342 응용 프로그래밍 [Apple] 엔터프라이즈 계정신청 (Enterprise Program) file YooN 2023.03.27 3968
341 웹 프로그래밍 XE - " Fatal error: Class 'Object' not found in " / class 낫파운드 오류 file YooN 2023.03.20 3644
340 응용 프로그래밍 [MSA] MSA란 무엇인가? 개념 이해하기 file YooN 2023.01.26 3426
339 웹 프로그래밍 iOS 앱 개발을 위한 인증서 생성 및 관리 file YooN 2023.01.18 3945
338 프로그래밍 [ iOS ] 앱 스토어 개인, 회사, 엔터프라이즈 차이점 file YooN 2023.01.09 2905
337 웹 프로그래밍 PHP 파서 이해하기 (<?php의 php를 생략하고 간단히 <? 태그 와 ?> 태그를 사용하는 방법) YooN 2016.08.10 5814
336 프로그래밍 SVN의 cleanup 에러시 해결방법 YooN 2016.05.05 4087
335 프로그래밍 [오류해결] svn cleanup failed-previous operation has not finished; run cleanup if it was interrupted file YooN 2016.05.05 4144
334 프로그래밍 TortoiseSVN 계정변경 file YooN 2016.05.05 2983
333 프로그래밍 SVN passwd 설정 : 계정 (users/passwd) file YooN 2016.05.04 3947
332 웹 프로그래밍 XE 비회원 글쓰기 항목 지우기 file YooN 2016.04.28 4436
331 응용 프로그래밍 메모리 영역 (code, data, stack, heap) file YooN 2016.03.23 4825
330 응용 프로그래밍 [SVN] Subversion 명령들 file YooN 2016.02.06 5588
329 응용 프로그래밍 IBM JDK 1.6 에서 Spring 2.5.2를 사용할 때 GenericTypeResolver 에서 NullPointerException이 발생하는 문제 YooN 2016.01.27 5750
328 웹 프로그래밍 오른쪽 마우스 금지 소스 / 드래그 금지 소스 YooN 2016.01.20 4245
327 응용 프로그래밍 [전자정부 표준프레임워크] 톰캣(Tomcat) 설치하기 file YooN 2016.01.02 4904
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 18 Next
/ 18


즐겨찾기 (가족)

JAESOO's HOMEPAGE


장여은 홈페이지


장여희 홈페이지


장여원 홈페이지


즐겨찾기 (업무)

알리카페 홀릭

숭실대 컴퓨터 통신연구실 (서창진)

말레이시아 KL Sentral 한국인 GuestHouse


즐겨찾기 (취미)

어드민아이디

유에코 사랑회

아스가르드 좋은사람/나쁜사람

JServer.kr

제이서버 메타블로그

재수 티스토리


즐겨찾기 (강의, 커뮤니티)

재수 강의 홈페이지


한소리


VTMODE.COM


숭실대 인공지능학과


숭실대 통신연구실


베너