가장 일반적으로 사용하는 Pagination
기법이다.
SELECT * FROM table LIMIT 15 OFFSET (page - 1) * 15;
사실 LIMIT
에는 문제가 없지만, OFFSET
에는 문제가 있다.
LIMIT 3
, OFFSET 0, 3, 6, 9
로 페이징 처리를 하는 상황이다.
offset이 0인 경우
1 ~ 3을 가져온다.
offset이 3인 경우
1 ~ 3의 데이터를 먼저 읽고, 4 ~ 6을 가져온다.
offset이 6인 경우
1 ~ 6의 데이터를 먼저 읽고, 7 ~ 9을 가져온다.
offset이 9인 경우
1 ~ 9의 데이터를 먼저 읽고, 10 ~ 12을 가져온다.
<aside>
💡 즉, OFFSET
은 앞의 데이터를 먼저 읽고, LIMIT
만큼 읽어서 응답하는 방식이다.
</aside>
만약, 1억개의 데이터가 있는 상황에서 OFFSET이 1억이라면, 1억개의 데이터를 먼저 읽고 응답하게 된다. DB 커넥션, Pool 등의 DB 성능과 관련된 작업까지 포함하게 된다면, 조회 성능은 row가 많고, offset이 커질 수록 저하하게 된다.