문서의 이전 판입니다!
offset
/limit
기반의 페이징 조회는 offset
이 뒤로 갈 때마다(즉, 페이지 번호가 커질 때마다) 성능이 계단현상으로 안 좋아지게 된다.asc
, DB 자체 기본 PK 정렬을 사용)PK > [앞선 조회의 마지막 PK] limit [pageSize]
형태로 조회를 이어나간다.<
로 한다.seek method
라고 부르는 듯 하며 (명확한 용어 정의가 된 상태는 아님) 더 보기(more)
방식이라고 하기도 한다. 를 넣어주는게 좋다. 이걸 하지 않으면 전체 정렬이 발생할 수 있다. 두번째 쿼리 부터는 PK의 최소값 비교가 항상 들어가므로 상관없다.
* 모든 seek method 쿼리에는
PK ⇐ 미리따로구한_max(PK column) 값을 항상 조회 조건에 넣어주는게 좋다(
desc는 반대).
* 이렇게 해야 불필요한 전체 정렬(
PK >= min의 역할)이나, 잘못된 인덱스를 타는 현상(
PK <= max 의 역할)이 발생하지 않는다.
===== 참조 =====
* Why Order By With Limit and Offset is Slow - Faster Pagination in Mysql
* OFFSET is bad for skipping previous rows
* Faster SQL Pagination with jOOQ Using the Seek Method – Java, SQL and jOOQ.
* Spring Batch와 Querydsl :
min(PK),max(PK)''를 비교 조건에 넣어야 하는 이유.