Index type 질문 있습니다.
1. 현재 학습 진도
몇 챕터/몇 강을 수강 중이신가요?
여기까지 이해하신 내용은 무엇인가요?
2. 어려움을 겪는 부분
어느 부분에서 막히셨나요?
코드의 어떤 로직이 이해가 안 되시나요?
어떤 개념이 헷갈리시나요?
3. 시도해보신 내용
문제 해결을 위해 어떤 시도를 해보셨나요?
에러가 발생했다면 어떤 에러인가요?
현재 작성하신 코드를 공유해주세요
이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다!
안녕하세요 강의 잘 보고 있습니다.
인덱스 타입은
인덱스만 조회하는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면된다.
라고 말씀을 하셨습니다.
근데 제가 클러스터 인덱스/논클러스터 인덱스/ 커버링 인덱스에 대한 개념을 아래와 같이 이해를 했습니다.
클러스터 인덱스 - PK를 키로 리프 노드에 모든 데이터가 저장돼 있는 구조
논클러스터 인덱스 - 세컨더리 인덱스를 키로 가지고, 리프 노드에는 “해당 세컨더리 인덱스의 PK를 데이터로 가지고 있음”.
커버링 인덱스 - 세컨더리 인덱스를 키로 가지고 있으며, 리프 노드에 “ 해당 세컨더리 인덱스의 PK와 실제 데이터를 가지고 있음”

그래서 위 사진과 같이 설명을 하셨을 때, 잘 이해가 되지 않은 부분이
price만 보는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면 된다.라는 말씀이 잘 이해가 되지 않습니다.
논 클러스터 인덱스의 경우에는 저는 아래와 같이 이해를 했습니다.
1.세컨더리 인덱스가 key이고, 리프 노드에 데이터로 PK를 가지고 있음
2.그래서 세컨더리 인덱데스로 원하는 데이터를 직접 찾기 위해서는 리프 노드에 있는 PK를 이용해서 직접 클러스터 인덱스로 접근해서 데이틀 조회해야됨”
그래서 제가 이해한 부분 중에 틀린 부분이 있는걸까요?
아니면 제가 이해한게 맞다면 “ price만 보는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면 된다”라는 말씀이 잘 이해가 되질 않습니다.
감사합니다.
답변 2
0
안녕하세요 blackhole124님!! 좋은 질문 감사합니다
제가 그 부분에서 조금 헷갈리게 설명을 드린 것 같습니다 😢
말씀해주신 내용이 거의 맞는데, 한 가지 놓친 부분이 있습니다! 논클러스터 인덱스의 리프 노드에는 PK + 인덱스 키 컬럼의 실제 값이 둘 다 저장되어 있습니다.
그래서 SELECT price FROM book WHERE price > 1000; 이런 쿼리를 실행하면
price 인덱스를 스캔해서 조건에 맞는 것들을 찾고
price 값은 이미 인덱스에 있으니까 바로 반환해버립니다
굳이 클러스터 인덱스까지 갈 필요가 없게 됩니다!
반대로 SELECT title, author, price FROM book WHERE price > 1000; 이런 쿼리라면 title이랑 author는 인덱스에 없으니까 PK로 클러스터 인덱스에 가서 가져와야 합니다.
실무에서는 이 차이를 활용해서 성능을 크게 개선할 수 있습니다! 예를 들어 사용자 상태별 집계를 할 때 굳이 모든 컬럼을 가져올 필요 없이 status 컬럼만 활용하면 엄청 빨라집니다!
커버링 인덱스의 정의는: "쿼리에 필요한 모든 컬럼이 인덱스에 포함되어서, 인덱스만으로 쿼리를 완전히 처리할 수 있는 상황"이므로
단일 컬럼 인덱스든 (
price만 SELECT)복합 인덱스든 (
status, name둘 다 SELECT)
상관없이 인덱스만으로 쿼리를 처리할 수 있으면 다 커버링 인덱스입니다.
좋은 질문 감사합니다 또 편하게 질문주세요!!
0
안녕하세요, 인프런 AI 인턴입니다. blackhole124님.
인덱스의 작동 방식과 관련하여 질문을 해 주셨군요. 클러스터 인덱스와 논클러스터 인덱스, 그리고 커버링 인덱스에 관련된 개념은 데이터베이스 성능을 이해하는 데 매우 중요합니다.
인덱스의 이해:
클러스터 인덱스 (Clustered Index):
- 이는 테이블의 데이터 자체가 정렬된 순서로 저장되는 인덱스를 말합니다. 보통 기본키가 클러스터 인덱스로 사용됩니다.
- 리프 노드는 실제 데이터 페이지 그 자체입니다.
- 이는 테이블의 데이터 자체가 정렬된 순서로 저장되는 인덱스를 말합니다. 보통 기본키가 클러스터 인덱스로 사용됩니다.
논클러스터 인덱스 (Non-Clustered Index):
- 세컨더리 인덱스라고도 불리며, 인덱스 키와 해당 레코드로 접근할 수 있는 주소(PK)를 저장합니다.
- 리프 노드에는 해당 인덱스가 참조하는 행의 주소가 포함되어 있고, 데이터를 읽기 위해서는 리프 노드에서 PK로 원본 행에 접근해야 합니다.
- 세컨더리 인덱스라고도 불리며, 인덱스 키와 해당 레코드로 접근할 수 있는 주소(PK)를 저장합니다.
커버링 인덱스 (Covering Index):
- 인덱스 자체가 쿼리에 필요한 모든 데이터를 포함하고 있어, 인덱스 스캔만으로 원하는 결과를 얻을 수 있습니다.
- 특정 쿼리가 인덱스의 일부 칼럼들만으로도 모든 필요한 데이터를 제공할 수 있다면, 추가적인 테이블 접근은 필요 없습니다.
- 인덱스 자체가 쿼리에 필요한 모든 데이터를 포함하고 있어, 인덱스 스캔만으로 원하는 결과를 얻을 수 있습니다.
질문에 대한 설명:
“price만 보는 경우에는 단순히 논 클러스터 인덱스 안에 있는 칼럼 값들만 조회하기만 하면 된다.“라는 말은 특정 쿼리에서 커버링 인덱스의 역할을 표현한 것입니다.
커버링 인덱스인 경우, 원하는 칼럼이 인덱스에 포함되어 있으면 추가적인 테이블 조회 없이 인덱스만으로 필요한 데이터를 얻을 수 있다는 것을 의미합니다. 이는 쿼리의 성능을 극대화시킵니다. 즉, price 칼럼이 인덱스에 포함되어 있다면, 인덱스 스캔만으로 데이터를 획득할 수 있다는 뜻입니다.
blackhole124님께서 이해하고 있는 개념은 매우 정확합니다. 다만, 특정한 쿼리 상황에서 커버링 인덱스가 어떻게 작용하는지를 추가로 이해하시면 도움이 됩니다.
더 자세한 설명과 유사한 질문을 다룬 게시물을 보고 싶으시다면, 다음 링크를 참고해 보세요:
- 질문 제목: 커버링 인덱스의 효과적인 사용에 대한 질문
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
조회속도 개선에서 더 개선하는 방법이 궁금합니다.
0
44
2
Build 관련 문제 (테스트 관련 문제)
0
44
2
인덱스 관련 질문 있습니다.
0
75
2
비관적 락 구현 방식 문의 건
0
82
2
외부 api 처리 방안에 대하여 궁금한 점이 있습니다.
0
93
2
네임드 락 사용 시 커넥션 풀을 분리하는 방법에 대한 질문
0
88
2
이벤트) 백엔드 기술면접 실전문제집
0
107
2
로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?
0
134
2
데드락 발생 시, 외래 키를 제거하는 방법 관련 질문
0
91
2
Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.
0
115
2
k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민
0
142
2
강의와 성능수치 비교
0
105
2
13강 강의 뒷부분의 과제 안내부분은 어디있나요?
0
52
2
이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문
0
66
2
[수업 자료 질문] Cache Aside의 특징 문의
0
89
2
[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의
0
83
2
블로그에 학습 내용 정리 포스트를 올려도괜찮나요?
0
113
2
멀티스레드 상황인데 currentParticipants 가 AtomicInteger가 아닌 이유?
0
91
3
클라우드 환경 배포시 부하 테스트 방식에 대하여
0
153
2
k6 dashboad 안나오는 상
0
119
2
2-4 도커 빌드 에러가 계속 납니다.
0
302
2
AWS EC2에 도커 컨테이너가 동작하지 않을 때 확인 해야하는 것
0
118
2
성능 측정시
0
114
2
API 별 실행 쿼리 모니터링 구현 질문 있습니다.
0
87
2





