CS Fundamentals
데이터베이스 인덱스에 대해서 설명해주세요
인덱스가 없으면 DB는 매번 전체 테이블을 뒤진다. B-Tree 구조부터 복합 인덱스, 커버링 인덱스, EXPLAIN 실행 계획까지 인터랙티브 시각화로 완전 정복합니다.
2026년 3월 15일 · 약 12분 읽기
Q. "데이터베이스 인덱스가 무엇인지 설명하고, B-Tree 구조와 실제 쿼리 최적화에 어떻게 활용하는지 말씀해주세요."
예상 꼬리질문
답변 가이드
"인덱스는 특정 컬럼 값을 기준으로 데이터 위치를 미리 정리해 둔 별도의 자료구조입니다. B+Tree 구조를 사용해 어떤 값을 찾아도 O(log n)의 일정한 탐색 횟수를 보장합니다."
"클러스터형 인덱스(Primary Key)는 데이터를 물리적으로 정렬해 저장하고, 비클러스터형 인덱스(Secondary Index)는 PK를 거쳐 데이터에 접근합니다. 복합 인덱스는 선두 컬럼 원칙에 따라 왼쪽부터 순서대로 사용해야 효과가 있습니다."
"쿼리 최적화 시 EXPLAIN의 type 컬럼을 먼저 확인합니다. ALL(풀스캔)이 보이면 인덱스 추가를 검토하고, 컬럼에 함수 적용이나 LIKE 앞 와일드카드는 인덱스를 무시하게 만드는 함정입니다."
100만 건 테이블에서 이메일 하나를 찾으면 DB는 어떻게 동작할까요? 인덱스가 없다면 첫 번째 행부터 마지막 행까지 하나씩 비교합니다. 인덱스가 있다면 20번 남짓한 비교만으로 결과를 찾습니다.
이 차이가 인덱스의 전부입니다. B+Tree 구조부터 복합 인덱스, 커버링 인덱스, EXPLAIN 실행 계획까지 직접 체험하며 이해해 보겠습니다.
1. B-Tree — 인덱스의 심장
꼬리질문: "인덱스의 내부 자료구조인 B+Tree가 어떻게 동작하는지 설명해주세요"
대부분의 RDBMS는 B+Tree 구조를 사용합니다. Root에서 시작해 Branch를 타고 내려가 Leaf에 도달하는 트리 구조로, 모든 Leaf Node가 같은 깊이를 유지해 어떤 값을 찾아도 탐색 횟수가 동일합니다.
Leaf Node끼리 양방향 연결 리스트로 연결되어 있어 BETWEEN, >, < 같은 범위 검색도 한 번의 탐색으로 처리합니다. 이것이 B-Tree가 아닌 B+Tree를 사용하는 이유입니다.
아래에서 B+Tree의 탐색 과정을 직접 체험해 보세요.
2. 클러스터형 vs 비클러스터형 인덱스
꼬리질문: "클러스터형 인덱스와 비클러스터형 인덱스의 차이는 뭔가요?"
클러스터형 인덱스는 데이터 행 자체가 인덱스 키 순서대로 물리적으로 저장됩니다. InnoDB에서 Primary Key가 바로 클러스터형 인덱스이며, 테이블당 1개만 존재할 수 있습니다. Leaf Node에 실제 데이터 행 전체가 담겨 있어 PK 조회는 단 한 번의 트리 탐색으로 완결됩니다.
비클러스터형 인덱스(Secondary Index)는 Leaf Node에 인덱스 키와 PK만 저장합니다. 조회 시 Secondary Index로 PK를 얻은 뒤 Clustered Index를 다시 탐색(Double Lookup)해야 합니다.
두 인덱스의 데이터 접근 방식을 비교해 보세요.
3. 복합 인덱스와 선두 컬럼 원칙
꼬리질문: "복합 인덱스에서 선두 컬럼 원칙이란 무엇인가요?"
두 개 이상의 컬럼을 묶어 하나의 인덱스를 만들 수 있습니다. 핵심 규칙은 선두 컬럼(Leftmost Prefix): (last_name, first_name, age) 복합 인덱스는 last_name이 조건에 없으면 인덱스를 타지 못합니다.
컬럼 선택도(Selectivity)도 중요합니다. 유니크한 값이 많을수록(이메일, 주문번호 등) 인덱스 효과가 크고, 값이 몇 종류뿐인 컬럼(성별, 상태값)은 인덱스 효과가 미미합니다.
어떤 쿼리가 복합 인덱스를 타고 어떤 쿼리가 타지 못하는지 확인해 보세요.
조건 없이 전체 테이블 반환
4. 커버링 인덱스와 EXPLAIN
꼬리질문: "커버링 인덱스가 무엇이고, EXPLAIN으로 어떻게 확인하나요?"
쿼리가 필요로 하는 모든 컬럼이 인덱스에 포함되면 실제 데이터 페이지에 접근하지 않고 인덱스만으로 결과를 반환합니다. 이를 커버링 인덱스라 하며, EXPLAIN 결과의 Extra 컬럼에 Using index가 표시됩니다.
EXPLAIN의 type 컬럼은 인덱스 활용 품질을 보여주는 핵심 지표입니다. ALL(풀스캔)에서 const(PK 단건 조회)까지 6단계가 있으며, 느린 쿼리를 최적화할 때 이 값을 먼저 확인합니다.
EXPLAIN 결과를 분석하며 인덱스 활용도를 직접 확인해 보세요.
SELECT * FROM users WHERE name LIKE '%Kim'
| type | key | rows | Extra |
|---|---|---|---|
| ALL | NULL | 1,000,000 | Using where |
5. 인덱스가 무시되는 함정
꼬리질문: "인덱스를 만들었는데도 쿼리가 느릴 때 원인이 뭔가요?"
인덱스를 생성했는데도 쿼리가 느리다면 대부분 인덱스를 타지 않는 패턴을 사용하고 있습니다. 컬럼에 함수를 적용하거나, LIKE 앞 와일드카드를 쓰거나, 묵시적 형변환이 일어나면 옵티마이저가 인덱스를 무시하고 풀스캔을 선택합니다.
아래 4가지 주요 함정을 익혀두면 느린 쿼리의 원인을 빠르게 파악할 수 있습니다.
각 함정 패턴을 확인하고 올바른 쿼리 작성법을 비교해 보세요.
각 카드를 클릭하면 올바른 쿼리와 EXPLAIN type을 확인할 수 있습니다.
WHERE YEAR(created_at) = 2024
WHERE name LIKE '%Kim'
WHERE user_id = '123' -- user_id는 INT
WHERE status = 'active' OR status = 'pending'
면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 데이터베이스 인덱스 질문은 준비 완료입니다.
- - 인덱스 생성 기준: 자주 조회되고, 선택도가 높고, 쓰기보다 읽기가 많은 컬럼
- - B+Tree: 모든 Leaf Node 같은 깊이, Leaf끼리 연결 리스트로 범위 검색 지원
- - 클러스터형 vs 비클러스터형: PK는 물리적 정렬 저장, Secondary는 Double Lookup
- - 복합 인덱스: 선두 컬럼 원칙 — 왼쪽부터 순서대로 사용해야 효과
- - EXPLAIN: 느린 쿼리 튜닝 시 첫 번째로 확인할 도구 — type: ALL이면 인덱스 검토
참고 자료
- Use The Index, Luke! — B-Tree 인덱스 완전 분석 — 인덱스를 가장 깊이 있게 다루는 무료 온라인 책. SQL 성능 튜닝의 바이블
- Jojoldu — 인덱스 정리 및 팁 (1) — 국내 최고의 MySQL 인덱스 실습 포스트. 실제 데이터로 EXPLAIN 분석하는 방법 단계별 안내
- Kakao Tech — MySQL Explain 완전 분석 — 카카오 DBA가 실제 운영 쿼리를 분석하며 EXPLAIN 각 컬럼의 의미를 설명
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.