오프셋 동작 방식
오프셋 방식은 시작 지점을 의미한다. 그래서 시작지점으로 부터 사용자에 보여질 목록의 개수대로 컷팅하여 보여주게 된다.

만약 offset 이 십만 + 5개를 설정한다면 단번에 이것이 10만 + 5개를 바로 넘어 수는 없습니다. 그렇기 때문에 처음부터 숫자를 하나하나 세가면서 요청한 offset이 맞는지 확인할 갈겁니다. 이런 경우 처음부터 스캔을 해야 한다는 문제가 있다. 그리고 불특정 사용자들이 offset을 이용하여 해당 목록들을 조회 할 경우 DB는 굉장히 힘들어 할 겁니다. (따라서 전보다 페이지 로딩이 느려진것 같은 느낌이 들면 오프셋의 비효율성 떄문에 그럴것이다.)

이와 다르게
커서
는 성능적인 면에서 우의를 가질 수 있습니다.커서의 동작 방식
커서는 말 그대로 가르키는 곳 (포인터)라고 봐도 무방합니다. 현재 보여진 목록 중에 맨 끝에 나온 사람 이래로 다음 목록을 구성하게 됩니다. 오프셋과 잠깐 비교하자면, 오프셋은 무조건 처음부터 요청한 offset까지 사람을 셀 겁니다. 하지만 cursor 자체는 해당 다음 목록 이래로 만 가져오기도 하면서 이전에 탐색한 사람들은 전혀 스캔하지 않기 때문에 DB가 덜 힘들어 할 것입니다.

오프셋과 커서의 포포몬쓰 차이
- 오프셋 쿼리 예시
SELECT * FROM ( SELECT ROWNUM() over (ORDER BY timestamp) rnum , A.* FROM table A ORDER BY timestamp ) WHERE ROWNUM BETWEEN 6 AND 10 // timestamp를 정렬 기준으로 전체 데이터의 행번호를 출력하고 이 번호를 기준으로 잘라내는 것입니다.
- 오프셋 방식은 오프셋 숫자가 클 수록 문제가 됩니다. 아래의 효율성 차이를 보면, 다량의 데이터를 테스트 하는 부분에서 아주 큰 차이를 보입니다.
오프셋 페이징 방식에서 마지막 페이지를 이용할 확률은 얼마정도 될까?
0%는 아니겠지만, 매우 작을 것이다.

= 그렇지만 7백만개의 데이터가 아니더라도, 그래프에서 확인 할 수 있듯이
오프셋 페이징의 시간복잡성 O(N)
, O(offset+limit)
때문에 오프셋이 커질수록 시간이 증가해 UX는 감소합니다. 반면 커서 페이징의 경우는 O(1), O(limit)로 항상 일정
합니다.결국, 전보다 페이지 로딩이 느려진 것같은 느낌이 든적이 있다면, 아마도 그건 오프셋 페이징의 비효율성 때문입니다 ‼️