← 질문 목록
#305깊이 0
목록을 나눌 때 번호와 커서는 무엇이 다른가?
답변 연습
내 답변 적어보기접힘
이 브라우저에 자동 저장 · 0자
모범답안 확인하기내 답변 뒤에 열어보세요
번호는 몇 개를 건너뛸지 말하고, 커서는 어느 지점 다음부터인지 말한다. 이 차이가 비용과 정확성을 가른다.
| 잣대 | 번호로 나누기 | 커서로 나누기 |
|---|---|---|
| 뒤 페이지 비용 | 건너뛴 만큼 읽어야 한다 | 인덱스가 받쳐 주면 같다 |
| 중간에 행이 늘면 | 항목이 밀려 겹치거나 빠질 수 있다 | 기준점 앞의 추가는 다음 페이지를 밀지 않는다 |
| 임의 페이지로 뛰기 | 바로 된다 | 시작점을 따로 들고 있어야 한다 |
번호 방식이 뒤로 갈수록 느린 이유는 건너뛰는 행도 읽기 때문이다. 백만 번째부터 스무 개를 달라고 하면 백만 개를 세고 버린다.
커서는 마지막으로 본 정렬 키를 기억하고 (created_at, id) > (?, ?)처럼 그 뒤를 묻는다. 같은 정렬의 복합 인덱스가 있으면 경계부터 범위 스캔한다. 다만 가져올 행 수와 실행 계획에 따른 비용은 남으므로 ‘늘 일정 시간’은 아니다.
핵심 정리
인덱스가 안 받쳐 주면 커서도 처음부터 훑는다. 커서 자체가 싼 것이 아니라, 인덱스를 쓸 수 있게 묻는 방식이라서 싼 것이다.
정렬은 항상 결정적이어야 한다. created_at 같은 값이 여럿이면 id를 함께 묶어 총순서를 만든다. 커서에도 두 값을 모두 담아야 경계에서 겹치거나 빠지지 않는다.
커서도 스냅샷은 아니다. 페이지 사이에 이미 본 행의 정렬 키가 바뀌거나 행이 삭제되면 보이는 결과가 달라질 수 있다. 한 시점의 결과가 필요하면 일관된 스냅샷이나 별도의 버전 기준이 필요하다.
몇 번째 페이지로 바로 뛰는 화면은 번호 방식이 단순하다. 커서로도 되지만 페이지마다 시작점을 미리 만들어 들고 있어야 한다.
전체 개수를 매번 세는 비용도 따져야 한다. 매번 세는 것이 페이지를 가져오는 것보다 비쌀 때가 있다.