강의

멘토링

로드맵

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

신나는 라이언님의 프로필 이미지
신나는 라이언

작성한 질문수

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

3-5. 인덱스의 심화 이론

인덱스 종류에 대해 질문드립니다!

해결된 질문

작성

·

10

0

3-5 강의에서 클러스터드 인덱스와 논 클러스터드 인덱스, 그리고 커버링 인덱스에 대해 궁금한게 있어서 질문드립니다.

 

  1. 논 클러스터드 인덱스가 원본 데이터를 한 번 더 찾아야하니까 느리다고 하셨는데 만약 커버링 인덱스 상황이라면 한번 더 타고 들어가지 않으니까 무조건적으로 클러스터드 인덱스에 비해서 더 느리다고 하는게 맞는 것인지 의문이 들었습니다.

 

  1. 클러스터드 인덱스 외에 부분 칼럼들에 대해 만드는 모든 인덱스는 논 클러스터드 인덱스이며 이제 이렇게 자동으로 만들어지거나 직접 만든 클러스터드와 논 클러스터드 인덱스에 대해 상황별로 커버링 인덱스 상태인지 아닌지로 나뉜다고 이해하면 될까요?

답변 2

0

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

라이언님 좋은 질문 해주셔서 감사합니다!!

1. 커버링 인덱스 상황에서는 논클러스터드가 더 빠를 수 있습니다

질문 주신 관점이 정확합니다! 논클러스터드 인덱스가 항상 느린 건 아닙니다. 커버링 인덱스 상황이라면 오히려 논클러스터드 인덱스가 클러스터드 인덱스보다 빠를 수 있어요.

왜냐하면 논클러스터드 인덱스는 필요한 컬럼만 가지고 있어서 데이터 크기가 작거든요. 예를 들어볼게요.

사용자 테이블(id, name, email, address, phone, created_at, updated_at 등 10개 컬럼)에서 "name으로 검색해서 email만 조회"하는 쿼리가 있다고 하면

SELECT email FROM users WHERE name = '홍길동';

INDEX(name, email)을 만들어두면 이게 커버링 인덱스가 되는데, 이 경우 논클러스터드 인덱스만 읽어도 되니까 실제 데이터 페이지를 안 찾아가도 됩니다. 반면 클러스터드 인덱스는 모든 컬럼(10개)을 다 들고 있어서 데이터 크기가 더 크죠.

실제로 측정해보면 커버링 인덱스를 탄 논클러스터드 인덱스가 클러스터드 인덱스보다 30-50% 정도 빠른 경우도 많습니다. 왜냐하면 같은 메모리 공간에 더 많은 인덱스 데이터를 올릴 수 있거든요.

2. 인덱스 분류 체계에 대한 이해는 거의 정확합니다

말씀하신 대로 이해하시면 되는데, 조금만 더 정확하게 정리해드릴게요.

클러스터드 인덱스와 논클러스터드 인덱스는 "인덱스의 종류"이고, 커버링 인덱스는 "인덱스의 상태"입니다.

  • 클러스터드 인덱스: 테이블당 1개만 존재 (보통 PK), 실제 데이터가 정렬된 상태

  • 논클러스터드 인덱스: 여러 개 만들 수 있음, 인덱스 키 + PK 주소를 가짐

그리고 이 두 종류의 인덱스 모두 "커버링 인덱스 상태"가 될 수 있습니다. 커버링 인덱스는 "쿼리가 필요로 하는 모든 컬럼을 인덱스가 포함하고 있는 상황"을 말하는 거거든요.

예를 들어

  • SELECT * FROM users WHERE id = 1 → 클러스터드 인덱스를 쓰는데, 이것도 커버링 인덱스 상태

  • SELECT email FROM users WHERE name = '홍길동' → INDEX(name, email)을 쓰면 논클러스터드 인덱스지만 커버링 인덱스 상태

정리하면 이렇게 이해하시면 됩니다

  • 모든 인덱스는 "클러스터드" 또는 "논클러스터드" 중 하나

  • 그 인덱스가 쿼리를 처리할 때 추가 데이터 조회 없이 해결되면 "커버링 인덱스 상태"

이런 개념을 실무에서 쓸 때는 EXPLAIN으로 실행 계획을 보면서 "Extra 컬럼에 Using index가 뜨는지"를 확인하면 됩니다. Using index가 뜨면 커버링 인덱스 상태로 동작하는 거거든요.

좋은 질문 감사합니다!! 좋은 주말 보내세요

0

안녕하세요, 인프런 AI 인턴입니다. 신나는 라이언님.

인덱스의 종류와 그 역할에 대한 질문을 주셨군요. 데이터베이스 인덱스의 구조와 작동 메커니즘은 시스템 성능 최적화에 있어서 매우 중요한 요소입니다. 각 인덱스의 특징과 상황별 사용 방법을 이해하는 것이 필요합니다.

클러스터드 인덱스와 논 클러스터드 인덱스

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

    • 클러스터드 인덱스는 테이블의 데이터가 실제로 정렬된 순서로 저장되는 인덱스입니다. 따라서 인덱스 자체가 데이터 그 자체입니다.
    • 보통 기본 키(primary key)가 클러스터드 인덱스로 사용되며, 각 테이블에는 하나의 클러스터드 인덱스만 있을 수 있습니다.
  2. 논 클러스터드 인덱스 (Non-Clustered Index):

    • 벗겨진 인덱스라고도 불리며, 인덱스는 데이터에 대한 참조를 포함합니다. 이 참조를 통해서만 실제 데이터를 접근할 수 있습니다.
    • 따라서 논 클러스터드 인덱스를 사용하면 인덱스 탐색 후 데이터 페이지에 접근해야 하므로, 클러스터드 인덱스보다는 액세스 속도가 비교적 느릴 수 있습니다.

커버링 인덱스 (Covering Index)

  • 커버링 인덱스는 쿼리에 필요한 모든 컬럼 값이 인덱스에 포함되어 있을 때 사용하는 용어입니다. 이 경우, 추가적인 데이터 페이지에의 접근 없이 인덱스만으로 쿼리를 완전히 처리할 수 있습니다.

  • 커버링 인덱스 상황에서는 데이터에 대한 직접적인 추가 접근이 필요하지 않기 때문에, 이러한 상황에서는 논 클러스터드 인덱스도 효율적으로 동작할 수 있습니다.

질문에 대한 답변:

  1. 클러스터드 vs. 논 클러스터드 및 커버링 인덱스:

    • 논 클러스터드 인덱스가 클러스터드 인덱스에 비해 데이터 접근 시 느릴 수 있는 이유는 클러스터드 인덱스는 데이터 자체의 정렬된 형태로 존재하기 때문입니다.
    • 하지만 커버링 인덱스 상황에서는 논 클러스터드 인덱스도 데이터 페이지를 직접 탐색하지 않으므로 클러스터드 인덱스에 비해 속도가 느리지 않습니다.
  2. 인덱스 구성:

    • 클러스터드 인덱스를 제외한 나머지는 논 클러스터드 인덱스라고 볼 수 있으며, 어떤 인덱스가 커버링 인덱스 상태인지 판단하려면 쿼리에 필요한 모든 데이터가 인덱스에 포함되어 있는지를 확인해야 합니다.

기존에 질문된 유사한 내용이 있는 게시물을 참고하시어 더 깊은 이해를 원하시면 아래 링크를 참조해 보세요:

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

신나는 라이언님의 프로필 이미지
신나는 라이언

작성한 질문수

질문하기