MySQL쿼리에 대한 튜닝은 1차적으로 explain을 사용하여 주로 index와 관련된 튜닝을 한다.

하지만 열심히 쿼리 튜닝을 실시했건만 처음엔 잘 돌아가는듯 하다가 어느시점이 되면 데이터가 늘어난 상태에서 페이지이동을 하면서 속도가 느려지는것을 볼수 있다.

게시판의 예를 들어보자. 100만건이정도의 데이터가 들어 있는 테이블에서 처음 몇페이지는 where 절에 있는 index의 성능에 좌우된다.
일반적으로 select * from board where bbs_id = 1 limit 30, 10;

하지만 뒤로 갈수록 속도가 느려지게 된다.
이때 profile 항목을 살펴보면 sending data에서 가장 많은 시간을 잡아먹는것을 알수 있다.
이럴때는 직접적인 조회보다 아래와 같이 두번에 걸쳐서 데이터를 가져오는것이 빠르다.

select idx from board where bbs_id = 1 limit 30, 10;

위의 결과에서 반환된 idx 값을 이용해서

SELECT * FROM BOARD WHERE IDX IN ( IDX 결과);

이렇게 할 경우 SENDING DATA 에서 소요되는 시간을 제거할 수 있다.

하지만 궁극적으로는 페이지 네이비게이션에서 LIMIT X, Y 와 같은 형태는 지양해야 할것이다.

엄청나게 데이터가 쌓이는 시스템에서는 더더욱 그렇다.

|< << < 2 3 4 5 6 > >> >| 와 같은 일반적인 형태의 페이지 네비게이션은 또한 검색엔진에 의해서도 시스템 부하를 야기할수 있다.

검색엔진은 주로 링크를 따라 이동하기 때문에 위와 같이 마지막 페이지에 대한 버튼이 노출되게 되면 몇백만껀 이상의 데이터만 쌓여도 시스템은 검색엔진에 의해 부하를 받게 된다.

최근의 경향을 보면 이전 | 다음 과 같은 형태의 네비게이션 형태를 보이고 있으며 여기에 이전데이터 보기 등과 같은 형태로 나뉘어져 있다.

이전 | 다음 과 같은 형태의 구성에서는 LIMIT x,y 가 아니라 마지막 읽은 글로부터 pagesize에 해당하는 데이터만 가져오기 때문에 이전 시스템에 비해 데이터 스캐닝하는 시간도 줄어들게 된다.