Topic (오늘의 주제)
관계형 데이터베이스(RDB)의 인덱스 (Index)
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 인덱스가 없으면 데이터베이스는 원하는 데이터를 찾기 위해 테이블의 처음부터 끝까지 다 뒤져야 합니다 (Full Table Scan). 데이터가 수백만 건일 때 인덱스가 없으면 조회 성능이 치명적으로 느려져 서비스 장애로 이어집니다.
- 구조적 의미: 책의 '색인(목차)'과 같습니다. 데이터의 저장 위치(포인터)를 키(Key)와 함께 별도의 구조(B-Tree 등)로 저장하여 검색 속도를 비약적으로 높이는 기술입니다. 단, 저장 공간을 추가로 사용하고 데이터 변경 시 인덱스도 수정해야 하므로 쓰기 성능을 희생하여 읽기 성능을 얻는 트레이드오프(Trade-off)가 있습니다.
- 면접 의도: DB 튜닝의 가장 기본이 되는 개념입니다. 단순히 "빠르다"를 넘어, 어떤 자료구조(B-Tree)를 쓰는지, 언제 인덱스를 걸어야 효율적인지(카디널리티), Clustered와 Non-Clustered의 차이를 아는지 확인합니다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | 테이블의 검색 속도를 향상시키기 위한 자료구조. (데이터 = 책의 내용, 인덱스 = 책의 색인) |
| 동작 방식 | 주로 B-Tree (Balanced Tree) 또는 B+Tree 구조를 사용. 데이터를 정렬된 상태로 유지하여 탐색 시 **O(log N)**의 시간 복잡도를 가짐. |
| 장점 | 1. 검색(SELECT) 속도가 매우 빠름. 2. 시스템 부하(CPU, Disk I/O)를 줄여 전체 성능 향상. |
| 단점 | 1. 인덱스를 위한 추가 저장 공간(약 10% 내외) 필요. 2. INSERT, UPDATE, DELETE 시 인덱스도 재정렬해야 하므로 쓰기 속도 저하. |
| 종류 | 1. Clustered Index: 실제 데이터 자체가 정렬됨. 테이블당 1개만 존재 (주로 PK). 리프 노드가 실제 데이터. 2. Non-Clustered Index: 별도의 인덱스 페이지 생성. 테이블당 여러 개 가능. 리프 노드가 데이터의 주소(포인터)를 가짐. |
Interview Answer Version (면접 답변식 요약)
"인덱스는 데이터베이스 테이블의 검색 속도를 높여주는 자료구조입니다. 책의 맨 뒤에 있는 색인처럼 동작하며, 주로 B-Tree 구조를 사용하여 데이터를 정렬된 상태로 관리합니다. 인덱스를 사용하면 SELECT 쿼리의 성능은 크게 향상되지만, 데이터를 추가하거나 수정할 때 인덱스도 함께 재정렬해야 하므로 INSERT, UPDATE, DELETE 성능은 다소 저하될 수 있습니다. 따라서 데이터의 변경 빈도와 조회 빈도를 고려하여 적절히 설계하는 것이 중요합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. 카디널리티(Cardinality)가 높은 컬럼에 적용하라
- 카디널리티: 데이터의 중복도가 낮고 고유한 값의 개수가 많은 정도.
- Good: 주민등록번호, ID, 이메일, 전화번호 (중복이 거의 없음 → 인덱스 효과 좋음)
- Bad: 성별(남/여), 예/아니오 (중복이 매우 많음 → 인덱스를 타도 절반을 읽어야 하므로 효과 미비)
2. 복합 인덱스(Composite Index)와 컬럼 순서
- 여러 컬럼을 묶어서 인덱스를 만들 때 순서가 매우 중요합니다.
- 예: (A, B)로 인덱스를 만들면 A로 정렬된 후 B로 정렬됩니다. 따라서 WHERE B = ? 조건만으로는 이 인덱스를 탈 수 없습니다. (Leftmost Prefix Rule)
3. 과도한 인덱스 생성 금지
- 인덱스는 공짜가 아닙니다. 불필요한 인덱스는 데이터베이스 사이즈를 키우고, 쓰기 작업 시 오버헤드를 발생시킵니다. 실제 쿼리의 **실행 계획(Explain)**을 분석하여 사용하지 않는 인덱스는 제거해야 합니다.
예상 꼬리질문 정리
Q1. 왜 인덱스로 해시(Hash)가 아닌 B-Tree(또는 B+Tree)를 주로 사용하나요?
- 핵심 키워드: 해시 인덱스는 O(1)로 매우 빠르지만 **동등 비교(=)**만 가능합니다. DB에서는 **부등호(<, >)**나 **범위 검색(BETWEEN)**이 빈번한데, B-Tree는 데이터가 정렬되어 있어 범위 검색에 훨씬 유리하기 때문입니다.
Q2. Clustered Index와 Non-Clustered Index의 차이는 무엇인가요?
- 핵심 키워드: Clustered는 책의 본문이 페이지 순서대로 정렬된 것(사전)과 같아 테이블당 1개만 존재하며 조회 속도가 가장 빠릅니다. Non-Clustered는 책 뒤의 색인(목차)과 같아 별도의 공간에 저장되며 테이블당 여러 개 만들 수 있지만, 실제 데이터를 찾기 위해 한 번 더 접근해야 하므로 Clustered보다 약간 느립니다.
Q3. '커버링 인덱스(Covering Index)'란 무엇인가요?
- 핵심 키워드: 쿼리가 요구하는 모든 컬럼이 인덱스에 포함되어 있어, 실제 데이터 테이블(디스크)을 읽지 않고 인덱스만 읽어서 쿼리를 완료하는 것을 말합니다. Disk I/O가 줄어들어 성능이 비약적으로 향상됩니다.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: 데이터베이스 동시성 이슈 (0) | 2026.01.29 |
|---|---|
| Daily Dev Q&A: 트랜잭션과 인덱스의 관계 (0) | 2026.01.29 |
| Daily Dev Q&A: Cookie vs Session (0) | 2026.01.23 |
| Daily Dev Q&A: HTTP vs HTTPS (0) | 2026.01.22 |
| Daily Dev Q&A: GET vs POST (개념 및 데이터 흐름) (0) | 2026.01.21 |