인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박정선님의 프로필 이미지

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.04 페이징 쿼리 작성

LIMIT, OFFSET을 사용하는 것과 범위 기반 방식의 성능 차이

해결된 질문

작성

·

136

0

안녕하세요. 강의 잘 듣고 있습니다. 제가 이해한바로는 LIMIT, OFFSET은 앞에서부터 data를 순차적으로 읽기때문에 성능 상 좋지 않고 이를 개선하기 위해 범위 기반 방식을 사용한다고 이해하였습니다.

범위 기반 방식은 직접 ID 값을 지정 해주는 방식이며, id 기반으로 5000단위로 조회한다고 가정하면

1회차: select * from users where id > 0 AND id <= 5000

2회차: select * from users where id > 5000 AND id <= 1000

위와 같이 구현될 것으로 예상됩니다.

관련해서 궁금한 점이 생겼는데요. 결국 두번째 쿼리를 실행 시 5000보다 큰 id를 찾는 과정에 시간이 소요될 것으로 예상되는데요, id가 index로 지정되어있어 LIMIT, OFFSET 방식보다 빠르게 찾을 수 있는 것인가요??
LIMIT, OFFSET 방식 사용 시 어떤 컬럼이 index로 지정되어있는지와 상관없이 무조건 순차 탐색이 일어나는 것이고 범위 기반으로 조회 시 index로 서치하기때문에 더 빠르게 시작점을 탐색할 수 있다고 이해하면 될까요?

답변 2

1

백은빈님의 프로필 이미지
백은빈
지식공유자

안녕하세요.

말씀하신 것처럼 users 테이블에 id가 인덱스로 지정돼있는 상황이라고 보시면 됩니다. 이 경우 범위 기반 방식 형태로 쿼리를 수행하면 조건에 만족하는 데이터만 읽게되므로, OFFSET이 증가할 수록 불필요하게 데이터를 많이 읽는 LIMIT & OFFSET 방식보다는 더 나은 것입니다.

예를 들어, 동일하게 users 테이블에 id가 PK라고 가정하고, id가 1부터 10000까지의 데이터를 1000개씩 나눠서 조회한다고 가정해볼게요.

LIMIT & OFFSET 방식의 경우 다음과 같이 쿼리를 실행하게 됩니다.

1) SELECT * FROM users WHERE id > 0 AND id <= 10000 ORDER BY id LIMIT 1000 OFFSET 0
2) SELECT * FROM users WHERE id > 0 AND id <= 10000 ORDER BY id LIMIT 1000 OFFSET 1000
3) SELECT * FROM users WHERE id > 0 AND id <= 10000 ORDER BY id LIMIT 1000 OFFSET 2000
...

반면, 범위 기반 방식의 경우 다음과 같이 쿼리를 실행하게 됩니다.

1) SELECT * FROM users WHERE id > 0 AND id <= 1000 ORDER BY id
2) SELECT * FROM users WHERE id > 1000 AND id <= 2000 ORDER BY id
3) SELECT * FROM users WHERE id > 2000 AND id <= 3000 ORDER BY id
...

LIMIT & OFFSET 방식에서 첫 번째 쿼리는 1000개 데이터만을 읽지만, 두 번째 쿼리는 2000개, 세 번째 쿼리는 3000개로 점점 쿼리 처리 시 읽는 데이터 양이 늘어납니다.

하지만 범위 기반 방식의 경우 쿼리 조건절에 아예 1000개씩 나눠진 범위가 조건으로 주어졌기 때문에, 각 쿼리마다 조건에 만족하는 1000개의 데이터만 읽게됩니다.

결론적으로, 인덱스 사용 유무에 따른 차이라기 보다는 LIMIT & OFFSET은 실제 읽어야 하는 시작지점(OFFSET)을 찾기위해 조건에 만족하는 데이터를 정렬 순서대로 순차적으로 읽어서 시작지점을 찾은 후 LIMIT 절에 해당되는 건수만큼 추가로 더 읽게 되서 범위기반보다 성능이 더 좋지 않다고 볼 수 있습니다.

질문 주셔서 감사하고, 추가로 궁금한 부분 있으시면 언제든지 다시 말씀해주세요.

수강 감사드립니다. :)

박정선님의 프로필 이미지
박정선
질문자

답변 감사합니다. 큰 도움이 된 것 같습니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.
박정선님께서 질문해주신 대로 LIMIT, OFFSET 방식은 데이터를 순차적으로 읽기 때문에 특정 상황에서는 성능이 좋지 않을 수 있습니다. 이에 반해 범위 기반 방식은 인덱스를 활용하여 시작 지점을 빠르게 찾을 수 있어 성능 향상에 도움이 됩니다.

범위 기반 방식에서 사용하는 id 컬럼이 인덱스로 지정되어 있다면, 쿼리가 데이터를 검색할 때 인덱스를 기반으로 해당 범위 내의 시작 지점을 빠르게 탐색할 수 있습니다. 이는 데이터베이스가 인덱스를 통해 효율적으로 데이터를 검색하기 때문입니다. 그러나 LIMIT, OFFSET 방식에서는 조회하는 시작점까지 모든 데이터를 순차적으로 탐색해야 하므로, 범위 기반 방식이 상대적으로 더 빠르게 동작할 수 있습니다.

따라서 박정선님께서 이해하신 것처럼, 범위 기반 조회 시 인덱스를 사용하여 시작점을 탐색하므로 성능 향상에 유리하다고 볼 수 있습니다.

이미지 URL이나 더 자세한 설명이 필요하시면 아래 링크를 참고하실 수 있습니다:
Spring Data JPA - Reference Documentation