OFFSET boundary

앞쪽 행이 바뀌면 OFFSET의 페이지 경계가 흔들린다

OFFSET은 “앞에서 몇 행을 건너뛸지”로 페이지를 자릅니다. 사용자가 1페이지를 본 뒤 앞쪽에 새 행이 끼면, 같은 OFFSET이 처음 기대한 경계와 다른 위치를 가리킵니다.

정렬은 안정적이어도 경계는 행 번호에 묶인다 ORDER BY created_at DESC, id DESC처럼 고유 보조 키를 붙여도, OFFSET 자체는 “현재 목록의 행 번호”를 기준으로 움직입니다.
문제가 생기는 순간 1페이지 조회 후 새 글 삽입, 삭제, 숨김 처리처럼 앞쪽 행 수가 바뀔 때입니다.
위치
처음 목록
새 행 삽입 후
OFFSET 3 결과
1
A
NEW
건너뜀
2
B
A
건너뜀
3
C
B
건너뜀
4
D
C
C 다시 노출
5
E
D
D
6
F
E
E
OFFSET 페이지 번호는 쉽지만 변경에 약하다 같은 OFFSET 3이 삽입 후에는 C를 다시 보여 줍니다.
Keyset 마지막으로 본 키 이후를 읽는다 마지막 키 C 이후 조건으로 다음 행을 읽어 경계 흔들림을 줄입니다.
전제 정렬 키와 커서 조건을 함께 설계한다 정렬 방향, 동률 처리용 보조 키, 인덱스 순서가 맞아야 합니다.