기존 페이징 방식의 문제점

주로 사용되는 Paging기법은 offset과 limit을 활용하는 방식이다.

하지만, 이 방식의 경우 페이지가 굉장히 많아지게 된다면 성능에서 문제가 생길 수 있다.

이유는 아래와 같이, 뒷 페이지를 읽기 위해서는 앞에서 읽었던 행들을 사용하지 않더라도 읽어야한다는 특징 때문이다.

결국 offset이 10000이고, limit이 50이면, 10050개를 읽어야 하기 때문이다.

Untitled

이때 Page가 offset, limit이 페이지당 노출시킬 데이터의 수이다.

No Offset 방식을 활용한 개선

이때 No Offset 방식을 사용하게 되면, 조회 시작 부분을 인덱스로 빠르게 찾아 매번 첫번째 페이지만 읽을 수 있도록 하는 방식이다.

기존의 방식은 아래와 같을 것이다.

select * from item
where 조건문
order by id desc
offset 페이지번호
limit 페이지사이즈

이를 아래와 같이 변경하는 것이다.

select * from item
where 조건문 and id < 마지막조회id
order by id desc
limit 페이지사이즈

이를 통해서 id (pk 혹은 인덱스)를 기반으로 조건을 걸어주고, 이를 기반으로 이후의 데이터만 limit만큼 조회하게 하여, 기존의 수많은 데이터를 불필요하게 읽어버리는 성능 낭비를 줄이는 것이다.

문제점

하지만, 모든 상황에서 No Offset 을 활용할 수 있는 것은 아니다.

마지막으로 조회한 데이터를 기반으로 다음 데이터를 가져오는 방식으로, offset을 사용하지 않는 것인데 이를 위해서는 무한 스크롤과 같이 특정 페이지를 이동하는 것이 아닌, 다음 페이지만 뜨게 하는 방식에서만 사용할 수 있다.

만약 1번 페이지를 보고 있다가 9번 페이지를 보게 된다면, 이러한 방식은 불가능할 것이다.

사용할 수 없는 경우가 또 있다.

예시로 보여준 경우는 where에서 사용되는 기준 Key가 중복이 가능한 경우이다.