Inflearn brand logo image

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

rex님의 프로필 이미지
rex

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.04 페이징 쿼리 작성

복합 index 문의

해결된 질문

작성

·

27

0

안녕하세요, 강의 잘 듣고 있습니다.

 

04 페이징 쿼리 작성 강의 > 데이터 개수 기반 방식 (동등 조건 사용 시) (9:36 부근) 에 나온 예시에 대한 질문입니다.

 

KEY index_userid_id (user_id, id)로 인덱스가 있는데요, user_id +id 가 아닌, user_id만 인덱스로 걸어도 N회차 쿼리가 잘 동작 할까요?

 

where 절에 user_id, id를 사용하고, ORDER BY 에 id가 있기 때문에 user_id + id 인덱스가 필요한 걸까요?

 

조금 더 자세히 알려주시면 감사하겠습니다.

답변 2

1

이성욱님의 프로필 이미지
이성욱
지식공유자

안녕하세요.

 

페이징에서 user_id 컬럼 뿐만 아니라 id 컬럼을 추가해서 복합 인덱스를 생성하는 것은, 중복된 user_id로 인해서 중간에 레코드가 짤리는 경우를 피하기 위해서 id 컬럼을 마지막에 추가한 것입니다. 아래와 같은 경우를 고려해보시면, 중간에 데이터가 사라지는 현상이 생길 수 있다는 것을 예상하실 수 있을 거에요. (첫번째 페이지의 마지막 user_id='esther' 일때, 다음 페이지는 user_id>'esther' 조건으로 검색해야 하는데, 이때 id = 11 인 레코드는 건너 뛸 위험이 있는거죠.

user_id    id
-------------
 esther    9
 esther    10
 esther    11
   matt    12
-------------

 

만약 user_id 가 중복이 없다면 (UNIQUE 하다면), 굳이 id 컬럼을 마지막에 추가하지 않고 user_id 컬럼만으로 인덱스를 생성해도 될듯 합니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
rex님께서 질문하신 내용은 인덱스 최적화와 관련된 사항입니다.

복합 인덱스(KEY index_userid_id (user_id, id))는 WHERE 절과 ORDER BY 절에 사용된 컬럼과 가장 일치하는 형태가 될 때 최적의 성능을 발휘합니다.

  1. user_id만 인덱스로 걸어도 N회차 쿼리가 제대로 동작하는가?

    • 경우에 따라 다르지만 일반적으로 복합 인덱스가 아닌 user_id 단일 인덱스를 사용하는 경우, ORDER BY id 조건을 만족시키기 위해 추가적인 정렬 작업이 필요할 수 있습니다. 특히 user_id가 동일한 여러 행을 id 순으로 정렬해야 하는 경우에 성능 이점이 제한될 수 있습니다.
  2. user_id + id 인덱스가 필요한 이유

    • WHERE 절에 user_idid가 사용되고, ORDER BY 절에 id가 있는 상황에서는 복합 인덱스를 사용하여 질의 성능을 향상시킬 수 있습니다. 이는 전체적인 데이터 스캔을 줄이고, 이미 정렬된 상태로 데이터를 검색할 수 있도록 해주기 때문입니다.

따라서, 주어진 사용 사례에서는 user_id, id에 대한 복합 인덱스를 사용하는 것이 더 효율적인 전략이 될 것입니다. 이는 쿼리의 실행 계획을 통해 실제 성능을 비교하여 결정할 수 있습니다.

추가적인 도움이 필요하시다면 또 질문해 주세요.

이미지 URL: index explanation

Origin URL: Spring Data JPA Documentation

rex님의 프로필 이미지
rex

작성한 질문수

질문하기