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의 탐색 과정을 직접 체험해 보세요.

Root
30|60
Branch
10|20
Branch
40|50
Branch
70|80
Leaf
1~9
Leaf
10~19
Leaf
20~29
Leaf
30~39
Leaf
40~49
Leaf
50~59
Leaf
60~69
Leaf
70~79
Leaf
80~90
Leaf 연결 리스트 (범위 검색 지원)
B+Tree: 탐색 깊이 O(log n) — 100만 행도 약 20번 비교로 찾습니다

2. 클러스터형 vs 비클러스터형 인덱스

꼬리질문: "클러스터형 인덱스와 비클러스터형 인덱스의 차이는 뭔가요?"

클러스터형 인덱스는 데이터 행 자체가 인덱스 키 순서대로 물리적으로 저장됩니다. InnoDB에서 Primary Key가 바로 클러스터형 인덱스이며, 테이블당 1개만 존재할 수 있습니다. Leaf Node에 실제 데이터 행 전체가 담겨 있어 PK 조회는 단 한 번의 트리 탐색으로 완결됩니다.

비클러스터형 인덱스(Secondary Index)는 Leaf Node에 인덱스 키와 PK만 저장합니다. 조회 시 Secondary Index로 PK를 얻은 뒤 Clustered Index를 다시 탐색(Double Lookup)해야 합니다.

두 인덱스의 데이터 접근 방식을 비교해 보세요.

클러스터형 인덱스Primary Key
Clustered Index
Root Node
id: [10 | 30 | 42 | ...]
방향 탐색
Branch Node
id=42 → 오른쪽 브랜치
데이터 저장
Leaf Node (행 전체)
{id:42, email:'a@a.com', name:'김철수', created_at:'2024-01-01'}
I/O: 1회 — 인덱스 탐색 = 데이터 접근
비클러스터형 인덱스Secondary Index
email 기준 정렬
Secondary Index Root
email: ['a@a.com' | 'b@b.com' | ...]
PK만 저장
Secondary Leaf
{email:'a@a.com', id:42} ← PK 포함
↓ id=42 로 Clustered Index 재탐색 (Double Lookup)
재탐색 완료
Clustered Leaf (행 전체)
{id:42, email:'a@a.com', name:'김철수', created_at:'2024-01-01'}
I/O: 2회 — Secondary 탐색 후 Clustered 재탐색
커버링 인덱스를 사용하면 Secondary Index에서도 Clustered 재탐색 없이 결과를 반환할 수 있습니다

3. 복합 인덱스와 선두 컬럼 원칙

꼬리질문: "복합 인덱스에서 선두 컬럼 원칙이란 무엇인가요?"

두 개 이상의 컬럼을 묶어 하나의 인덱스를 만들 수 있습니다. 핵심 규칙은 선두 컬럼(Leftmost Prefix): (last_name, first_name, age) 복합 인덱스는 last_name이 조건에 없으면 인덱스를 타지 못합니다.

컬럼 선택도(Selectivity)도 중요합니다. 유니크한 값이 많을수록(이메일, 주문번호 등) 인덱스 효과가 크고, 값이 몇 종류뿐인 컬럼(성별, 상태값)은 인덱스 효과가 미미합니다.

어떤 쿼리가 복합 인덱스를 타고 어떤 쿼리가 타지 못하는지 확인해 보세요.

INDEX(last_name, first_name, age)
WHERE 조건에 포함할 컬럼:
인덱스 활용 분석:
last_name
first_name
age
인덱스 활용 필터링만 (인덱스 부분 사용) 인덱스 미사용
EXPLAIN type:(조건 없음)

조건 없이 전체 테이블 반환

선두 컬럼 원칙: 복합 인덱스는 왼쪽 컬럼부터 연속으로 사용해야 효과가 있습니다

4. 커버링 인덱스와 EXPLAIN

꼬리질문: "커버링 인덱스가 무엇이고, EXPLAIN으로 어떻게 확인하나요?"

쿼리가 필요로 하는 모든 컬럼이 인덱스에 포함되면 실제 데이터 페이지에 접근하지 않고 인덱스만으로 결과를 반환합니다. 이를 커버링 인덱스라 하며, EXPLAIN 결과의 Extra 컬럼에 Using index가 표시됩니다.

EXPLAIN의 type 컬럼은 인덱스 활용 품질을 보여주는 핵심 지표입니다. ALL(풀스캔)에서 const(PK 단건 조회)까지 6단계가 있으며, 느린 쿼리를 최적화할 때 이 값을 먼저 확인합니다.

EXPLAIN 결과를 분석하며 인덱스 활용도를 직접 확인해 보세요.

쿼리
SELECT * FROM users
WHERE name LIKE '%Kim'
EXPLAIN 결과
typekeyrowsExtra
ALLNULL1,000,000Using where
type 등급 (빠른 순 →)
ALL
<
index
<
range
<
ref
<
eq_ref
<
const
앞 와일드카드 LIKE는 인덱스 정렬 순서를 파괴 → 인덱스 미사용, 전체 100만 행 스캔

5. 인덱스가 무시되는 함정

꼬리질문: "인덱스를 만들었는데도 쿼리가 느릴 때 원인이 뭔가요?"

인덱스를 생성했는데도 쿼리가 느리다면 대부분 인덱스를 타지 않는 패턴을 사용하고 있습니다. 컬럼에 함수를 적용하거나, LIKE 앞 와일드카드를 쓰거나, 묵시적 형변환이 일어나면 옵티마이저가 인덱스를 무시하고 풀스캔을 선택합니다.

아래 4가지 주요 함정을 익혀두면 느린 쿼리의 원인을 빠르게 파악할 수 있습니다.

각 함정 패턴을 확인하고 올바른 쿼리 작성법을 비교해 보세요.

각 카드를 클릭하면 올바른 쿼리와 EXPLAIN type을 확인할 수 있습니다.

1. 함수 사용▼ 펼치기
✗ 나쁜 쿼리ALL
WHERE YEAR(created_at) = 2024
2. LIKE 앞 와일드카드▼ 펼치기
✗ 나쁜 쿼리ALL
WHERE name LIKE '%Kim'
3. 묵시적 형변환▼ 펼치기
✗ 나쁜 쿼리ALL
WHERE user_id = '123'  -- user_id는 INT
4. OR 조건 확대▼ 펼치기
✗ 나쁜 쿼리ALL
WHERE status = 'active'
   OR status = 'pending'
느린 쿼리 발견 시 EXPLAIN으로 type을 확인하고, 위 4가지 패턴부터 점검하세요

면접 체크리스트

이 항목들을 자신 있게 설명할 수 있다면 데이터베이스 인덱스 질문은 준비 완료입니다.

  • - 인덱스 생성 기준: 자주 조회되고, 선택도가 높고, 쓰기보다 읽기가 많은 컬럼
  • - B+Tree: 모든 Leaf Node 같은 깊이, Leaf끼리 연결 리스트로 범위 검색 지원
  • - 클러스터형 vs 비클러스터형: PK는 물리적 정렬 저장, Secondary는 Double Lookup
  • - 복합 인덱스: 선두 컬럼 원칙 — 왼쪽부터 순서대로 사용해야 효과
  • - EXPLAIN: 느린 쿼리 튜닝 시 첫 번째로 확인할 도구 — type: ALL이면 인덱스 검토

참고 자료


의견을 들려주세요

서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.

0 / 1000