핵심 요약
페이지 번호로 점프해야 하는 관리자 테이블이면 offset(LIMIT/OFFSET), 무한 스크롤·피드·대용량이면 cursor(마지막 항목 기준 그 다음부터)가 맞다. offset은 OFFSET이 커질수록 DB가 앞 행을 다 세야 해서 느려지고, 중간에 삽입되면 항목이 중복·누락된다.
1. 비교
| offset | cursor | |
|---|---|---|
| 구현 | 쉬움 | 약간 복잡 |
| 깊은 페이지 성능 | 나쁨 | 일정 |
| 삽입 시 안정성 | 밀림 | 안정 |
| 임의 페이지 점프 | 가능 | 불가 |
2. cursor 쿼리
-- 마지막으로 본 id 이후 20개
SELECT * FROM posts
WHERE id < $lastId -- 정렬 컬럼 기준
ORDER BY id DESC
LIMIT 20;
정렬 컬럼은 유일·불변(보통 id나 created_at+id 복합)이어야 안정적이다.
3. 함정
- offset 깊은 페이지(OFFSET 100000)는 인덱스가 있어도 느리다
- cursor는 정렬 기준이 유일하지 않으면 경계에서 항목이 샌다 — id를 tiebreaker로
- cursor 값은 불투명 토큰으로 인코딩하면 API가 깔끔하다
자주 묻는 질문
offset이 왜 느려지나요?
OFFSET N은 앞의 N개를 읽고 버린 뒤 다음을 반환합니다. N이 커질수록 버리는 일이 늘어 느려집니다. cursor는 WHERE로 시작점을 바로 찾아 일정합니다.
cursor로 특정 페이지로 점프가 안 되는데요?
cursor는 본질적으로 "이전 항목 다음"이라 임의 페이지 번호 점프엔 부적합합니다. 점프가 꼭 필요하면 offset을, 무한 스크롤이면 cursor를 쓰세요.

댓글 0