index 분할을 이용한 리스트 속도향상

index 분할을 이용한 리스트 속도 향상

게시판에서 자료가 쌓여 갈수록 속도가 느려집니다.
이유는 다들 아시다 시피 index 를 이용하더라도

select * from ez_board_test order by bid desc limit 100000,10
실행속도 14.110 sec
하면 속도가 많이 느려집니다.
실제로 거의 모든 게시판은 저장된 시간이 오래된 것일수록 뒤로 가야 하기 때문에 글이 쎃이면 쌓일수록 limit x,y 에서 x 의 값이 커질수 밖에 없습니다.

이러한 속도를 빨라지게 하기 위해서 index 분할을 이용합니다.

index 분할 이란 각각의 게시물을 그룹별로 묶어서 리스트에 접근시 해당 그룹 내에서만 select 한다는데 장점이 있습니다.

select * from ez_board_test order by bid desc limit 100000,10
이 아닌
select * from ez_board_test where index_id=100 order by bid desc limit 150,10

과 같은 형태로 찾아는 것입니다.

이러한 쿼리문은 먼저 index_id 값을 가진 게시물을 전체에서 선별해서 그 안에서 order by 와 limit 가 일어나기 때문에 모든 게시물을 전체 불러와야 하는 부담이 적다는데 그 목적과 장점이 있습니다.

제가 만든 게시판의 경우에는 5000 개 단위로 index 값을 나누어 두었습니다.
이 방법을 사용하면 모든 페이지에서 게시물 리스트 속도가 0.1초를 넘어가지 않게 됩니다.
이 알고리즘의 기본적인 테이블 구조를 말씀드리겠습니다.

index 저장 테이블
index_id smallint(3) not null primary key 아이디 값 저장
count smallint(4) not null default’0′ 해당 index 가 가지는 게시물 수(게시물이 많이지면 전부 5000 개를 가지게 됩니다.)
total_num int(11) unsigned not null 현재 index 와 지난 index 들이 가지는 총 게시물 수

게시물 저장 테이블
index_id smallint(3) not null
bid int(11) unsigned not null auto_increment primary key
기타 제목 내용등 저장 필드들
key index_index(index_id)

위와 같은 구조로 리스트 시에 아래와 같은 쿼리문을 만들어 쓰고 있습니다.

SELECT board.bid, board.fid, board.depth, board.uid, board.cid, if(board.uid,ez_user.nickname,board.name) as name, ifnull(ez_user.icon,”) as icon, board.subject, board.content, board.hit, board.vote, board.comment_cnt, board.secret, board.deleted, board.signdate, board.file_name FROM ez_board_test board LEFT JOIN ez_user ON board.uid=ez_user.uid WHERE board.index_id = 68 order by board.fid desc,board.depth LIMIT 0,10

현재 게시물 30만 약간 넘은 테스트 게시판의 실제 쿼리문입니다.
중간에 사용자 테이블과의 조인이 좀 있어서 속도가 많이 걱정이 되긴 하지만 5000 개 내에서 아무리 조인을 해도 체감속도에는 거의 지장이 없습니다.