OFFSET은 앞의 행도 읽고 버려
처음 10페이지는 괜찮아 보여도 ?page=N의 N이 1000이면 요청할 때마다 앞의 1만 행을 읽고 버려. OFFSET 비용은 선형으로 늘어서 사용자가 100페이지를 눌렀을 때도 8초가 걸릴 수 있어.
마지막 위치에서 이어 읽어
마지막으로 본 (created_at, id)를 커서로 보내고 그보다 뒤의 20행을 ORDER BY와 LIMIT으로 가져오면 색인 범위가 곧장 이어져. 페이지 50이든 더 깊든 20행씩 읽는 비용은 일정해.
항상 동점 기준을 넣어
같은 시각 값이 있을 수 있으므로 id를 함께 정렬해 중복과 누락을 막아. 키셋 방식은 기본적으로 앞쪽 탐색만 쉽고 임의의 ‘50페이지’ 점프는 포기해야 해. 이전·다음 커서를 따로 두면 양방향 이동은 가능하지만 URL은 ?page=N 대신 불투명한 커서 값을 쓰게 돼.