LIMIT & OFFSET 구문 사용 보통
항상 최선의 방식이 아님
오히려 DBMS 서버에 더많은 부하 발생
데이터베이스는 오프셋에 지정된 위치까지 모든 레코드를 순차적으로 읽은후에야 원하는 데이터 반환
이것은 디비가 특정 오프셋 이후 데이터만 가져올 수 없다는 것을 뜻함
앞에꺼를 다읽고 가져와야 되는구나
페이지 오프셋 값이 올라갈수록 더 많은 데이터를 읽어야되고 시스템은 더 큰 부담을 줌
- 범위 기반
- 데이터 개수 기반 방식
어떤 범위로 나눠서 데이터 나눠서 조회
쿼리에서 LIMIT 절이 사용 되지않는 다는 점에서 기존 페이징 방식과 구별 됨.
테이블에 대해 날짜나 숫자 기반의 일정한 범ㅇ뉘로 데이터 나눠서 조회 시 유리함 (대량 데이터)
EX) 테이블 생성일자 컬럼 기준으로 한달치 데이이터를 일주일 단위로 나눠
처리하거나 오토 인크리먼트 컬럼 값 바탕으로 일정한 숫자 범위나눠서 처리
장점: 쿼리 단순성 여러 쿼리 나눠실행해도 사용하는 컬럼 동일 유지
특정 날짜 컬럼에 대해 기간을 나누어 조회하는 경우 쿼리 성능향상을 위해
해당 컬럼에 대한 인덱스 미리 생성해 두는 것이 좋음
누락을 방지하기위해 오른쪽과 같이 쿼리를 작성해야됨
계속보다보니 인피니트 스크롤 쿼리구현시 예제랑 똑같다
두개의 조건이 OR로 연결
첫번째 조건 : 마지막 순서에 해당되는 FINISHED_AT , ID 값이 조건으로 주어지고
마지막 데이터의 FINISED_AT 과 같으면서 ID 값은 더큰 조건
이전에 반환된 마지막 데이터의 경우 같은 finishedAt값을 가지는 데이터가 여러개 있고
같은 값을 가지는 데이터중 그 다음 순서에 해당되는 데이터를 읽어와야 됨으로
finishiedAt 값은 이전에 반환된 마지막 데이터와 동일하면서 id 값은 이보다 큰
데이터를 반환하도록 조건이 주어짐
두번째 조건 : 그 다음 순서의 finished_at 값에 해당하는 데이터를 불러와야 됨
이전에 반환된 마지막 데이터의 finsished_at 보다 크고 최초 조건으로 주어졌던
2024 1/2 일보다는 작은 날짜 값을 가지는 경우 대한 조건이 or 로 추가 됨
where절에 식별자 컬럼 조건만 추가해도 문제없는 케이스
created A 컬럼의 값순서와 id 컬럼의 값 순서가 동일한 경우
쿼리 처능상향을위해 create_at 이전에 반환된 마지막 날짜 값으로 지정해줘야 된다.
이처럼 범위 조건으로 주어진 컬럼과 식별자 컬럼인 ID 컬럼의 값순서가 동일한 경우
n 회차 쿼리가 1회차 쿼리의 식별자 컬럼에 대한 조건만 추가적으로 명시하는 형태로 사용 될 수 있다
LIMIT & OFFSET 구문의 문제점
범위 기반 방식
주로 배치 작업 등에서 많이 사용되는 방식
이 방식은 날짜나 ID 같은 특정 컬럼의 값을 기준으로 데이터를 나눠서 조회
예를 들어, "2023년 1월 1일부터 1월 7일까지의 데이터"처럼 범위를 정해서 조회합니다. 이 방식은 LIMIT을 사용하지 않아 데이터베이스 부하를 줄일수 있다.
데이터 개수 기반 방식
인덱스의 중요성
데이터 누락 방지