💻 [데이터베이스] 인덱스 원리와 동작 구조 정리
2025. 5. 9. 20:24

🎯 개요

인덱스(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:

  • 조회 성능이 자주 필요한 컬럼 위주로 최소한의 인덱스만 설정하는 것이 중요

✍️ 마무리 요약

  • 인덱스는 성능 최적화를 위한 핵심 도구지만, 만능은 아니다
  • 무분별한 인덱스는 오히려 성능을 저하시킬 수 있기 때문에
    조회 패턴과 테이블 구조를 함께 고려하여 전략적으로 설계해야 한다
  • 복합 인덱스의 순서, 커버링 인덱스 활용, 인덱스 히트 유무는 실무 성능에 큰 영향을 준다