해결된 질문
작성
·
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
절에 사용된 컬럼과 가장 일치하는 형태가 될 때 최적의 성능을 발휘합니다.
user_id만 인덱스로 걸어도 N회차 쿼리가 제대로 동작하는가?
user_id
단일 인덱스를 사용하는 경우, ORDER BY id
조건을 만족시키기 위해 추가적인 정렬 작업이 필요할 수 있습니다. 특히 user_id
가 동일한 여러 행을 id
순으로 정렬해야 하는 경우에 성능 이점이 제한될 수 있습니다.user_id + id 인덱스가 필요한 이유
WHERE
절에 user_id
와 id
가 사용되고, ORDER BY
절에 id
가 있는 상황에서는 복합 인덱스를 사용하여 질의 성능을 향상시킬 수 있습니다. 이는 전체적인 데이터 스캔을 줄이고, 이미 정렬된 상태로 데이터를 검색할 수 있도록 해주기 때문입니다.따라서, 주어진 사용 사례에서는 user_id, id
에 대한 복합 인덱스를 사용하는 것이 더 효율적인 전략이 될 것입니다. 이는 쿼리의 실행 계획을 통해 실제 성능을 비교하여 결정할 수 있습니다.
추가적인 도움이 필요하시다면 또 질문해 주세요.
이미지 URL: index explanation
Origin URL: Spring Data JPA Documentation