강의

멘토링

로드맵

Inflearn コミュニティ Q&A

pjsw83613437 のプロフィール画像
pjsw83613437

投稿した質問数

Real MySQL シーズン 1 - Part 1

Ep.04 ページング クエリの作成

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

解決済みの質問

作成

·

316

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로 서치하기때문에 더 빠르게 시작점을 탐색할 수 있다고 이해하면 될까요?

mysqldbms/rdbmsbackendquery-tuningmysql-query

クイズ

MySQL에서 CHAR와 VARCHAR 데이터 타입의 주요 차이점은 무엇일까요?

CHAR는 가변 길이, VARCHAR는 고정 길이 문자열을 저장해요.

CHAR는 최대 길이만큼 공간을 미리 할당하고, VARCHAR는 저장된 데이터만큼만 공간을 사용해요.

VARCHAR는 인덱스를 사용할 수 없지만, CHAR는 사용할 수 있어요.

VARCHAR는 최대 저장 용량이 CHAR보다 훨씬 작아요.

回答 2

1

eunbinbaeck0088님의 프로필 이미지
eunbinbaeck0088
インストラクター

안녕하세요.

말씀하신 것처럼 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 절에 해당되는 건수만큼 추가로 더 읽게 되서 범위기반보다 성능이 더 좋지 않다고 볼 수 있습니다.

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

수강 감사드립니다. :)

pjsw83613437님의 프로필 이미지
pjsw83613437
質問者

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

0

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

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

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

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

pjsw83613437 のプロフィール画像
pjsw83613437

投稿した質問数

質問する