인프런 커뮤니티 질문&답변
커버링 인덱스에 대해서 질문드립니다.
작성
·
33
0
안녕하세요. 강의 정말 잘 듣고 있습니다. 강의를 듣다가 커버링 인덱스(Covering Index) 관련해서 궁금한 점이 생겨 질문드립니다.
커버링 인덱스는 SELECT 문에서 조회하는 컬럼들이 모두 인덱스에 포함되어 있을 때, 원본 테이블을 조회하지 않고 인덱스만으로 쿼리를 처리할 수 있는 방식이라고 이해했습니다.
그렇다면,SELECT에 포함된 컬럼들이 각각 단일 인덱스로 존재하는 경우에도 커버링 인덱스로 처리될 수 있는지 궁금합니다.
아니면 반드시 하나의 복합 인덱스(composite index) 로 묶여 있어야 커버링 인덱스로 동작하는 것인지 알고 싶습니다.
예를 들어,
id는 Primary Key라서 자동으로 인덱스가 생성되어 있고name컬럼에 대해서도 검색을 위해 인덱스를 추가하려고 할 때
다음 두 방식 중 어떤 것이 더 적절한지 궁금합니다.
name컬럼에 단일 인덱스를 생성(id, name)형태의 복합 인덱스를 생성
이 경우 커버링 인덱스 관점에서 어떤 방식이 더 올바른 설계인지 설명해주시면 감사하겠습니다 :>
답변 3
1
안녕하세요. 강의 잘 들어주셔서 감사합니다.
결론부터 말씀드리면 커버링 인덱스는 하나의 인덱스 안에 SELECT에 필요한 컬럼들이 모두 포함되어 있어야 동작합니다. 각 컬럼에 단일 인덱스가 따로 존재한다고 해서 커버링 인덱스로 처리되지는 않습니다.
따라서 질문 주신 예시에서 (id, name) 복합 인덱스는 id가 선두 컬럼이라 name 검색에는 도움이 되지 않기 때문에 이 상황에서는 name 단일 인덱스를 추가하는 것이 맞는 방향입니다. 그리고 검색 결과에 name 외에도 다른 컬럼들이 함께 조회된다면, 해당 컬럼들까지 포함한 복합 인덱스를 만들어 커버링 인덱스로 설계하는 것도 고려할 수 있습니다.
다만 검색 기능을 구현해야 하는 경우에는 일반적인 B-Tree 인덱스 보다 별도의 검색 시스템(예: Full-Text Search나 검색 엔진)을 사용하는 방식을 고려하는 것이 일반적인 접근입니다.
0
답변 감사합니다! 추가적으로 "[실습] 인덱스 생성" 강의 중 9분 48초에 나오는 코드
Explain
select id, name
from user
where name = 'Alice';select문에서 id가 선행 컬럼임에도 불구하고 idx_user_name 이라는 인덱스를 활용해서 커버링 인덱스가 활용되었습니다.
따로 찾아본 결과, pk가 아닌 일반 컬럼을 기준으로 인덱스 생성 시, 내부적으로 pk 컬럼을 마지막 컬럼으로 복합 인덱스로 생성된다고 하는데, 그럼 name 검색 시, 앞선 답변에서 알려주신 대로 (name, id) 안에 id, name 컬럼이 모두 들어있고, idx_user_name 인덱스를 커버링 인덱스로 활용한다고 생각하면 전체적인 과정이 이해됩니다. 이렇게 이해해도 되는 걸까요?
감사합니다 :>
0
안녕하세요, 인프런 AI 인턴입니다. dt10002님.
좋은 질문을 주셔서 감사합니다. 커버링 인덱스는 쿼리 성능을 최적화하는 방법 중 하나이며, 이는 인덱스만으로 필요한 데이터를 모두 제공하여 테이블에 접근할 필요를 줄일 수 있는 장점이 있습니다.
커버링 인덱스와 관련하여 질문하신 내용에 대해 답변드리겠습니다:
커버링 인덱스의 원리:
- 커버링 인덱스의 혜택을 누리기 위해서는 쿼리에서 사용하는 모든 컬럼이 하나의 복합 인덱스에 포함되어 있어야 합니다. 이는 다수의 단일 인덱스를 사용하는 것과는 차이가 있습니다.
- 각각의 인덱스는 개별적인 데이터 페이지를 참조하기 때문에, 단일 인덱스들로는 커버링 인덱스의 이점을 얻기 어렵습니다.
- 커버링 인덱스의 혜택을 누리기 위해서는 쿼리에서 사용하는 모든 컬럼이 하나의 복합 인덱스에 포함되어 있어야 합니다. 이는 다수의 단일 인덱스를 사용하는 것과는 차이가 있습니다.
복합 인덱스의 이점:
(id, name)형태의 복합 인덱스를 생성하면, 데이터베이스는id와name컬럼에 대한 정보를 하나의 인덱스 페이지에 저장하여, 테이블 액세스 없이 인덱스만으로 쿼리를 해결할 수 있습니다.
- 이것이 커버링 인덱스로 작용하여, 성능상의 이점을 제공합니다. 실제로 쿼리 시 필요한 데이터가 모두 이 인덱스에 포함되어 있기 때문에 테이블의 원본 데이터를 조회하지 않아도 됩니다.
설계 방향:
- 복합 인덱스는 테이블 크기 및 쿼리의 특성을 고려하여 결정해야 하며, 만약 빈번히 사용되는 쿼리가
id와name을 모두 동시에 사용하는 경우, 복합 인덱스를 구성하면 효과적일 수 있습니다.
- 단일 인덱스는 각각의 컬럼에 대한 조회가 빈번히 일어나고, 두 컬럼을 함께 사용할 가능성이 적을 때의 선택지입니다.
- 복합 인덱스는 테이블 크기 및 쿼리의 특성을 고려하여 결정해야 하며, 만약 빈번히 사용되는 쿼리가
질문 주신 주제에 대해 이 기존 질문을 참고하면 도움이 될 것입니다: 인덱스 설계 시 컬럼 선택 기준.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





네, 그렇게 이해하셔도 됩니다.
MySQL(InnoDB)에서는 보조 인덱스에 PK 값이 함께 저장되기 때문에 name 인덱스의 실제 구조는 (name, PK)에 가깝습니다. 그래서 SELECT id, name 조회 시 인덱스만으로 결과를 반환하는 커버링 인덱스가 됩니다.