강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kyungsookko01112547
kyungsookko01112547

câu hỏi đã được viết

MySQL thực sự Phần 1 - Phần 1

Ep.04 Tạo truy vấn phân trang

복합인덱스 정렬

Đã giải quyết

Viết

·

190

0

안녕하세요. 강의를 잘 듣고 있는 수강생입니다.

강의를 듣다가 좀 다른 결일 수도 있는 궁금증이 있습니다.

범위기반 데이터 조회에 아래 예시에서 order by finished_at, id 부분에서 finished_at이 범위검색 쿼리로 들어가는데 이런 경우 뒤에 있는 id는 인덱스를 타지 않는 것으로 알고 있습니다. 그럼 id로 범위 검색하려고 하면 finished_at으로 검색된 범위 안 전체 데이터를 전부 스캔하게 되나요?

select * from payments where finished_at ≥ ‘시작날짜’ and finished_at < ‘종료날짜’ and id > 8 order by finished_at, id limit 30

mysqldbms/rdbmsbackendquery-tuningmysql-query

Câu trả lời 1

0

eunbinbaeck0088님의 프로필 이미지
eunbinbaeck0088
Người chia sẻ kiến thức

안녕하세요.

테이블에 (finished_at, id)로 구성된 인덱스가 있다고 가정했을 때, 공유해주신 쿼리가 실행되면 인덱스 데이터에서 finished_at이 '시작날짜' 값 이상인 데이터들을 쭉 스캔하면서 id > 8인 데이터들을 확인하고 이렇게 확인된 데이터가 LIMIT 절에 주어진 30건을 만족하면 쿼리는 종료됩니다.

LIMIT 절이 주어지지 않으면 말씀하신 것처럼 기본적으로 finished_at 컬럼에 주어진 조건 범위로 인덱스 데이터를 전부 스캔할 것으로 예상합니다. 쭉 스캔하면서 id 컬럼에 주어진 조건을 만족하는지 추가로 확인하게 됩니다.

그리고 이러한 동작 방식은 id 컬럼에 대한 조건이 범위 조건이 아니고 동등조건이라 하더라도, 인덱스의 선두 컬럼인 finished_at 컬럼에 대해 범위 조건이 주어졌기 때문에 동일하게 동작합니다.

그럼 추가로 궁금한 부분 있으시면 다시 말씀해주세요.

감사합니다.

Hình ảnh hồ sơ của kyungsookko01112547
kyungsookko01112547

câu hỏi đã được viết

Đặt câu hỏi