Pagination이란?
데이터를 여러 페이지 단위로 묶어서 보여주는 기법
1. Offset 기반 Pagination
SELECT * FROM posts ORDER BY created_at DESC LIMIT 10 OFFSET 20;
OFFSET과 LIMIT으로 원하는 페이지 구간을 잘라서 가져온다.
OFFSET: 어디에서부터 데이터를 가져올 것인지?LIMIT: 몇 개를 가져올 것인지?
페이지 버튼과 함께 사용할 때 유리함
구현이 간단하고, 페이지 점프가 가능하다.
SELECT * FROM posts ORDER BY created_at DESC LIMIT 40 OFFSET 0; SELECT * FROM posts ORDER BY created_at DESC LIMIT 40 OFFSET 40; SELECT * FROM posts ORDER BY created_at DESC LIMIT 40 OFFSET 80; --- 건너뛰기 SELECT * FROM posts ORDER BY created_at DESC LIMIT 40 OFFSET 160;OFFSET이 커질수록 느려진다.
- 데이터를 조회할 때 매번 OFFSET 만큼의 데이터를 조회한 이후 요청된 개수의 데이터를 조회한다.
데이터 정합성 문제가 발생할 수 있다. (데이터의 중복과 누락 발생 가능)

💡 커버링 인덱스(쿼리를 충족시키는데 필요한 모든 데이터를 갖고 있는 인덱스) 이용
: SELECT, WHERE, GROUP BY, ORDER BY, LIMIT 등에서 사용되는 모든 컬럼이 인덱스에 포함. 디스크의 레코드를 읽지 않아도 되기 때문에 처리 속도가 빨라진다. but! 인덱스가 많아지면 디스크의 공간이 증가하고, 쓰기 성능이 저하되기 때문에 적절하게 인덱스를 설계하도록 하자.
2. Cursor 기반 Pagination
SELECT * FROM posts WHERE id < 100 ORDER BY id DESC LIMIT 10;
- 마지막으로 조회한 데이터의 키(보편적으로 pk 혹은 timestamp)를 기준으로 그 이후 데이터를 조회한다.
- 무한 스크롤과 함께 사용할 때 유리함
- 성능이 우수하고, 데이터의 일관성이 유지된다.
- 중간 페이지 이동이 불가능하고, 커서 관리가 필요하다.
'✏️ > Database' 카테고리의 다른 글
| [MySQL] 조인 알고리즘 (Nested Loop Join, Hash Join) (1) | 2025.07.16 |
|---|---|
| [MySQL] 프로시저 (0) | 2023.12.30 |
| [MySQL] Mac OS - error 2002 (hy000) can't connect to local mysql server through socket '/tmp/mysql.sock' (2) 해결 (0) | 2021.10.10 |
| [MySQL] 사용자 추가, 권한 설정, 삭제 (0) | 2021.09.13 |