SQLite OFFSET 페이지네이션 성능 비교
준비
- nodejs 스크립트로 100만개의 랜덤 데이터를 csv 파일 생성
- csv 파일을 sqlite에 import
sqlite> .mode csv
sqlite> .import ./posts.csv post
오프셋, 인덱스 비교
- 오프셋 0, 90만을 기준으로 비교
- 논클러스터 인덱스 기준으로 비교
- 인덱스 생성 코드
sqlite> create index index_created_at on post (created_at);
오프셋 0, 인덱스 ❌

오프셋 0, 인덱스 ✅

오프셋 90만, 인덱스 ❌

오프셋 90만, 인덱스 ✅

클러스터 vs 논클러스터 인덱스?
클러스터 인덱스

논클러스터 인덱스

OFFSET vs Cursor 페이지네이션?
- Cursor 페이지네이션은 WHERE로 작성
- 인덱스 ❌ 기준
OFFSET 페이지네이션

Cursor 페이지네이션

결론
- offset 페이지네이션시 order by 컬럼의 인덱스를 생성하는게 성능에 좋음
- 클러스터 인덱스는 물리적으로 레코드가 정렬되어있어서 random disk IO 성능에서 좋음
- offset 페이지네이션은 OFFSET 값이 클수록 처음 페이지부터 읽어서 필요없는 페이지 데이터들을 버리기 때문이 성능에 안좋음
- 커서 기반 페이징은 인덱스가 없어도 성능 좋음