🎯 개요
인덱스(Index)는
데이터베이스에서 원하는 데이터를 빠르게 찾기 위한 자료구조입니다.
책의 목차처럼,
전체 데이터를 다 훑지 않고 필요한 정보를 빠르게 접근할 수 있도록 도와줍니다.
🧠 인덱스란?
✅ 인덱스란?
- 특정 컬럼의 값을 정렬된 상태로 저장하고,
- 검색 시 해당 값을 빠르게 찾을 수 있도록 지원하는 구조입니다.
✅ 인덱스를 사용하면
- WHERE, JOIN, ORDER BY 성능이 크게 향상됩니다.
- 다만 쓰기 성능(INSERT/UPDATE/DELETE)에는 영향이 있습니다.
📋 인덱스 동작 구조 (B+Tree 기반)
단계 | 설명 |
1 | 검색 조건이 붙은 SQL 실행 (ex. WHERE user_id = 100) |
2 | 인덱스 트리(B+Tree)를 따라 탐색 시작 |
3 | 루트 노드 → 중간 노드 → 리프 노드 순으로 이동 |
4 | 리프 노드에 저장된 주소(pointer)를 통해 실제 데이터(Row) 접근 |
✅ 핵심 구조는 B+Tree,
모든 실제 데이터는 리프 노드에만 존재하고,
오름차순 정렬이 유지됨.
🔥 인덱스 종류 및 특징
인덱스 종류 | 설명 | 사용 예시 |
기본 인덱스 (B+Tree) | 가장 일반적인 인덱스 구조 | WHERE, ORDER BY |
유니크 인덱스 | 중복값 불가, 고유성 보장 | PK, 유니크 제약조건 |
복합 인덱스 | 여러 컬럼 조합으로 구성 | WHERE a AND b |
커버링 인덱스 | 인덱스에 필요한 모든 컬럼이 포함 | SELECT 컬럼이 모두 인덱스 내에 있음 |
해시 인덱스 (MySQL Memory 엔진 등) |
해시 함수 기반 → 매우 빠른 탐색 | 단일 정확값 검색에 적합 (범위 검색 불가) |
🛠 실무 예시 및 주의할 점
✅ 인덱스 생성 예시
CREATE INDEX idx_user_email ON users(email);
✅ 복합 인덱스 예시
CREATE INDEX idx_user_name_email ON users(name, email);
📌 주의사항
- WHERE 절에서 앞쪽 컬럼부터 차례대로 사용해야 효과 있음
→ WHERE name = ?는 OK
→ WHERE email = ?는 단독으로는 비효율적 - 인덱스가 너무 많으면
→ INSERT/UPDATE 시 부하 증가
→ 디스크 사용량 증가
→ 옵티마이저가 잘못된 인덱스를 사용할 수도 있음
✅ TIP:
- 조회 성능이 자주 필요한 컬럼 위주로 최소한의 인덱스만 설정하는 것이 중요
✍️ 마무리 요약
- 인덱스는 성능 최적화를 위한 핵심 도구지만, 만능은 아니다
- 무분별한 인덱스는 오히려 성능을 저하시킬 수 있기 때문에
조회 패턴과 테이블 구조를 함께 고려하여 전략적으로 설계해야 한다 - 복합 인덱스의 순서, 커버링 인덱스 활용, 인덱스 히트 유무는 실무 성능에 큰 영향을 준다
'컴퓨터 과학 > 데이터베이스' 카테고리의 다른 글
💻 [데이터베이스] ORM과 JPA 제대로 이해하기 (0) | 2025.05.09 |
---|---|
💻 [데이터베이스] 락(Lock)과 트랜잭션 격리 수준의 관계 (0) | 2025.05.09 |
💻 [데이터베이스] 정규화 vs 비정규화 차이 정리 (0) | 2025.05.09 |
💻 [데이터베이스] 트랜잭션 격리 수준 (Isolation Level) (0) | 2025.04.29 |
💻 [데이터베이스] 트랜잭션과 ACID 정리 (0) | 2025.04.29 |