SQLite OFFSET 페이지네이션 성능 비교

junsangyu·2024년 10월 15일

준비

  • 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 값이 클수록 처음 페이지부터 읽어서 필요없는 페이지 데이터들을 버리기 때문이 성능에 안좋음
  • 커서 기반 페이징은 인덱스가 없어도 성능 좋음
profile
👨🏻‍💻

0개의 댓글