강의

멘토링

로드맵

Inflearn brand logo image

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

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

3-7. 쿼리플랜 실제로 파악해보기.

Index type 질문 있습니다.

해결된 질문

작성

·

18

0

1. 현재 학습 진도

  • 몇 챕터/몇 강을 수강 중이신가요?

     

  • 여기까지 이해하신 내용은 무엇인가요?

 

2. 어려움을 겪는 부분

  • 어느 부분에서 막히셨나요?

  • 코드의 어떤 로직이 이해가 안 되시나요?

  • 어떤 개념이 헷갈리시나요?

 

3. 시도해보신 내용

  • 문제 해결을 위해 어떤 시도를 해보셨나요?

  • 에러가 발생했다면 어떤 에러인가요?

  • 현재 작성하신 코드를 공유해주세요

 

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다!

 

 

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

인덱스 타입은

인덱스만 조회하는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면된다.

라고 말씀을 하셨습니다.

근데 제가 클러스터 인덱스/논클러스터 인덱스/ 커버링 인덱스에 대한 개념을 아래와 같이 이해를 했습니다.

클러스터 인덱스 - PK를 키로 리프 노드에 모든 데이터가 저장돼 있는 구조

논클러스터 인덱스 - 세컨더리 인덱스를 키로 가지고, 리프 노드에는 “해당 세컨더리 인덱스의 PK를 데이터로 가지고 있음”.

커버링 인덱스 - 세컨더리 인덱스를 키로 가지고 있으며, 리프 노드에 “ 해당 세컨더리 인덱스의 PK와 실제 데이터를 가지고 있음”

 

image.png

 

그래서 위 사진과 같이 설명을 하셨을 때, 잘 이해가 되지 않은 부분이

price만 보는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면 된다.라는 말씀이 잘 이해가 되지 않습니다.

논 클러스터 인덱스의 경우에는 저는 아래와 같이 이해를 했습니다.

1.세컨더리 인덱스가 key이고, 리프 노드에 데이터로 PK를 가지고 있음

2.그래서 세컨더리 인덱데스로 원하는 데이터를 직접 찾기 위해서는 리프 노드에 있는 PK를 이용해서 직접 클러스터 인덱스로 접근해서 데이틀 조회해야됨”

그래서 제가 이해한 부분 중에 틀린 부분이 있는걸까요?

아니면 제가 이해한게 맞다면 “ price만 보는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면 된다”라는 말씀이 잘 이해가 되질 않습니다.

감사합니다.

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 blackhole124님!! 좋은 질문 감사합니다

제가 그 부분에서 조금 헷갈리게 설명을 드린 것 같습니다 😢

말씀해주신 내용이 거의 맞는데, 한 가지 놓친 부분이 있습니다! 논클러스터 인덱스의 리프 노드에는 PK + 인덱스 키 컬럼의 실제 값이 둘 다 저장되어 있습니다.

그래서 SELECT price FROM book WHERE price > 1000; 이런 쿼리를 실행하면

  1. price 인덱스를 스캔해서 조건에 맞는 것들을 찾고

  2. price 값은 이미 인덱스에 있으니까 바로 반환해버립니다

  3. 굳이 클러스터 인덱스까지 갈 필요가 없게 됩니다!

반대로 SELECT title, author, price FROM book WHERE price > 1000; 이런 쿼리라면 title이랑 author는 인덱스에 없으니까 PK로 클러스터 인덱스에 가서 가져와야 합니다.

실무에서는 이 차이를 활용해서 성능을 크게 개선할 수 있습니다! 예를 들어 사용자 상태별 집계를 할 때 굳이 모든 컬럼을 가져올 필요 없이 status 컬럼만 활용하면 엄청 빨라집니다!

커버링 인덱스의 정의는: "쿼리에 필요한 모든 컬럼이 인덱스에 포함되어서, 인덱스만으로 쿼리를 완전히 처리할 수 있는 상황"이므로

  • 단일 컬럼 인덱스든 (price만 SELECT)

  • 복합 인덱스든 (status, name 둘 다 SELECT)

상관없이 인덱스만으로 쿼리를 처리할 수 있으면 다 커버링 인덱스입니다.

좋은 질문 감사합니다 또 편하게 질문주세요!!

0

안녕하세요, 인프런 AI 인턴입니다. blackhole124님.

인덱스의 작동 방식과 관련하여 질문을 해 주셨군요. 클러스터 인덱스와 논클러스터 인덱스, 그리고 커버링 인덱스에 관련된 개념은 데이터베이스 성능을 이해하는 데 매우 중요합니다.

인덱스의 이해:

  1. 클러스터 인덱스 (Clustered Index):

    • 이는 테이블의 데이터 자체가 정렬된 순서로 저장되는 인덱스를 말합니다. 보통 기본키가 클러스터 인덱스로 사용됩니다.
    • 리프 노드는 실제 데이터 페이지 그 자체입니다.
  2. 논클러스터 인덱스 (Non-Clustered Index):

    • 세컨더리 인덱스라고도 불리며, 인덱스 키와 해당 레코드로 접근할 수 있는 주소(PK)를 저장합니다.
    • 리프 노드에는 해당 인덱스가 참조하는 행의 주소가 포함되어 있고, 데이터를 읽기 위해서는 리프 노드에서 PK로 원본 행에 접근해야 합니다.
  3. 커버링 인덱스 (Covering Index):

    • 인덱스 자체가 쿼리에 필요한 모든 데이터를 포함하고 있어, 인덱스 스캔만으로 원하는 결과를 얻을 수 있습니다.
    • 특정 쿼리가 인덱스의 일부 칼럼들만으로도 모든 필요한 데이터를 제공할 수 있다면, 추가적인 테이블 접근은 필요 없습니다.

질문에 대한 설명:

  • “price만 보는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면 된다.“라는 말은 특정 쿼리에서 커버링 인덱스의 역할을 표현한 것입니다.

  • 커버링 인덱스인 경우, 원하는 칼럼이 인덱스에 포함되어 있으면 추가적인 테이블 조회 없이 인덱스만으로 필요한 데이터를 얻을 수 있다는 것을 의미합니다. 이는 쿼리의 성능을 극대화시킵니다. 즉, price 칼럼이 인덱스에 포함되어 있다면, 인덱스 스캔만으로 데이터를 획득할 수 있다는 뜻입니다.

blackhole124님께서 이해하고 있는 개념은 매우 정확합니다. 다만, 특정한 쿼리 상황에서 커버링 인덱스가 어떻게 작용하는지를 추가로 이해하시면 도움이 됩니다.

더 자세한 설명과 유사한 질문을 다룬 게시물을 보고 싶으시다면, 다음 링크를 참고해 보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

blackhole124님의 프로필 이미지
blackhole124

작성한 질문수

질문하기