offset
/limit
기반의 페이징 조회는 offset
이 뒤로 갈 때마다(즉, 페이지 번호가 커질 때마다) 성능이 계단현상으로 안 좋아지게 된다.where
조건에 속하는 데이터가 이미 조회를 마친 페이지 부분에서 추가/삭제가 발생하면totalCount
까지 매번 세개 되면 성능저하가 더 커지게 된다.asc
, DB 자체 기본 PK 정렬을 사용)PK > [앞선 조회의 마지막 PK] limit [pageSize]
형태로 조회를 이어나간다.<
로 한다.seek method
라고 부르는 듯 하며 (명확한 용어 정의가 된 상태는 아님) 더 보기(more)
방식이라고 하기도 한다.order by PK asc|desc
는 항상 있어야 한다. 이는 모든 페이징 기법에서 마찬가지 이다.PK >= 미리따로구한_min(PK column)
를 넣어주는게 좋다. 이걸 하지 않으면 전체 정렬이 발생할 수 있다. 두번째 쿼리 부터는 PK의 최소값 비교가 항상 들어가므로 상관없다.PK ⇐ 미리따로구한_max(PK column)
값을 항상 조회 조건에 넣어주는게 좋다(desc
는 반대).PK >= min
의 역할)이나, 잘못된 인덱스를 타는 현상(PK <= max
의 역할)이 발생하지 않는다.asc
정렬일 때 기준이며, desc
이면 반대로 해야한다.SELECT MIN(PK) FROM TABLE; -- 값 저장: pkmin SELECT MAX(PK) FROM TABLE; -- 값 저장 : pkmax -- 조회 시작시 SELECT * FROM TABLE WHERE pk >= [pkmin] AND pk <= [pkmax] [기타조건] ORDER BY pk ASC LIMIT [pageSize] -- 그 뒤부터는 SELECT * FROM TABLE WHERE pk > [앞선 조회의 마지막 PK값] AND pk <= [pkmax] [기타조건] ORDER BY pk ASC LIMIT [pageSize]
min(PK),max(PK)
를 비교 조건에 넣어야 하는 이유.