게시판 페이징(?) 속도 향상
안녕하세요.
요새 php를 공부하고 있는데요,
여기 글을 보니, 페이징을 위해 보통 select 문의 limit를 쓰는 것 같더군요. 그런데 limit가.... 좀 이상합니다. '속도 향상'이라 제목을 붙이긴 했는데, 그보다 limit 의 결과가 이상하고 해서, 다른 분 어떻게 하는지 궁금해서 씁니다.
우선 db는 mysql이고,
테이블에는 20만개의 글이 들어가 있고, 게시판용 테이블입니다. 테이블 크기는 100M가 넘는, 좀 큰 테이블입니다. ( 글 내용은 성경 1절을 10번 반복)
답변형 게시판인데, 목록 보여줄때 int 형 한필드만 기준해서 정렬되도록 되어 있습니다. 그 필드 이름은 thread 입니다. thread 필드는 primary key로 인덱스됩니다.
PC는 PIII 800MHz, win2k에 mysql을 깔았습니다. php는 iis에서 돌립니다.
그런데, limit 가 좀 이상합니다.
쿼리1. select num,thread from board order by thread desc limit 200000,20
이런 쿼리문이 33초가 걸립니다. ( num은 int형입니다 )
쿼리2. select thread from board order by thread desc limit 200000,20
이건 0.18 초면 됩니다. ... 이상하지 않습니까?
한편
쿼리3. select thread from board where thread>0 order by thread desc limit 200000,20
이건 결국 같은 쿼리임에도 ( thread는 항상 양수임 ) 44초가 걸립니다.
limit가 들어갈때, mysql이 좀 멍청해(?) 지는 것 같아요. 쿼리 1이 그렇게 느리다면, 애초에 2로 thread만 구해서, 그 thread에 해당하는 num 값만 찾으면 훨씬 빠를 것 같은데,... 그렇게 안하나 봅니다.
또 이상한건,
select thread from board where thread<200000 order by thread desc limit 20
이건 0.06초면 되는데,
select thread,num from board where thread<200000 order by thread desc limit 20
이건 20초가 걸린다는 겁니다. ( 한편
select thread,num from board where thread between 200000 and 200020 order by thread desc 이건 인덱스가 제대로 먹어서 0.00 초 대입니다 )
쿼리2가 왜 그렇게 빠른지, 정확히 모르겠습니다. select 문 전체에 필드가 하나만 쓰이면, 테이블로 가지 않고 인덱스에서만 해결해도 되어서 그렇지 않을까 하는 생각이 듭니다. 전에 어디선가 본 covered-query 같은 것 아닐까 하는 생각이 드네요.
암튼, 그래서 내린 결론으로, 페이징을 대략 다음처럼 하면 빠르지 않을까 하는 겁니다. ( 에러 처리는 뺍니다. )
$pagesize=20; # 페이지당 글수
$p = 페이지번호;
$pstart = $p*$pagesize;
$conn = mysql_connect("localhost","xxx","xxx");
$res= mysql_select_db("xxx");
$sql = "select thread from board order by thread desc limit $pstart,$pagesize";
$rs = mysql_query( $sql, $conn);
$num_row=mysql_affected_rows( $conn );
$row=mysql_fetch_row($rs);
$thread_end=$row[0];
mysql_data_seek($rs, $num_row-1);
$row=mysql_fetch_row($rs);
$thread_start=$row[0];
$sql = "select thread,title,email,uname,refer,idate from board where thread between $thread_start and $thread_end order by thread desc";
$rs = mysql_query( $sql, $conn);
#... 이하 $rs로 작업
실제로 해보니까, 20만건에서 마지막 페이지 가는 것이 0.5초가 안걸리더군요. ( 원래대로 하면 timeout에 걸립니다 )
출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=2641
관리하는 사이트 데이터 건수가 50만건이 좀 넘어가니.. 게시판 페이징 이동시 약간 느린감이 있어서 튜닝중
번호 | 제목 | 글쓴이 | 조회 | 날짜 |
---|---|---|---|---|
38 | [PHP] 파파고 API | 관리자 | 4584 | 2021.01.29 16:33 |
37 | [AWS] 아마존 개인화 amazon personalize-dg | 관리자 | 3998 | 2020.01.22 19:33 |
36 | [PHP] 소녀나라 구인공고 | 관리자 | 6297 | 2018.04.17 12:54 |
>> | [MYSQL] 게시판 페이징(?) 속도 향상 [1] | 관리자 | 14502 | 2014.08.13 02:18 |
34 | [MYSQL] 페이징 쿼리, 페이징 기법 | 관리자 | 25286 | 2014.08.13 01:48 |
33 | [MYSQL] 이메일 필터 정규식 | 관리자 | 10685 | 2014.07.25 11:32 |
32 | [PHP] Zen HTML Selectors | 관리자 | 9003 | 2014.03.12 17:16 |
31 | [PHP] zen coding~! 젠코딩 Zen HTML Elements | 관리자 | 11313 | 2014.03.12 17:16 |
30 | [PHP] 에디트 플러스 zen coding CSS | 관리자 | 10564 | 2014.03.12 17:16 |
29 | [PHP] php + jquery ajax + json | 관리자 | 8489 | 2014.03.04 15:30 |
28 | [PHP] php 엑셀 파일 생성시 한글깨짐 | 관리자 | 11508 | 2014.02.21 16:31 |
27 | [PHP] 날씨 API, 기상청 날씨 파싱 | 관리자 | 14032 | 2014.01.22 15:32 |
26 | [PHP] 도로명주소 | 관리자 | 8607 | 2014.01.09 11:39 |
25 | [MYSQL] MYSQL EXPLAIN | 관리자 | 8836 | 2013.10.28 12:10 |
24 | [PHP] PHP, AJAX, JSON 리턴 | 관리자 | 10155 | 2013.10.18 17:49 |
23 | [MYSQL] mysql성능 향상 | 관리자 | 7252 | 2013.10.07 12:52 |
22 | [MYSQL] mysql 최적화 | 관리자 | 7942 | 2013.10.07 12:35 |
21 | [PHP] PHP 변수 초기화 및 조건부 할당 | 관리자 | 9234 | 2013.09.25 00:57 |
20 | [PHP] 킴스큐 썸네일 사이즈 변경 | 관리자 | 7547 | 2013.07.16 14:14 |
19 | [PHP] 간단하게 만드는 캐싱 | 관리자 | 8455 | 2013.05.21 14:11 |