데이터베이스 성능 최적화의 핵심 INDEX

손주현·2025년 4월 10일
0

DBMS

목록 보기
3/3
post-thumbnail

데이터베이스에서 대량의 데이터를 빠르게 검색하려면 어떻게 해야 할까?
바로 인덱스(Index)를 사용하는 것이다.


인덱스란?

  • 인덱스는 데이터베이스 테이블의 데이터를 빠르게 조회하기 위한 자료구조이다.
  • 도서관의 책 색인처럼, 원하는 데이터를 효율적으로 찾을 수 있도록 도와주는 역할을 한다.

예를 들어, 아래와 같은 쿼리를 실행한다고 가정해본다면

SELECT * FROM users WHERE user_id = 123;
  • user_id에 인덱스가 없다면 → 모든 데이터를 Full Scan
  • user_id에 인덱스가 있다면 → 인덱스를 통해 바로 해당 위치 조회

인덱스의 자료구조

인덱스 종류특징
B-Tree 인덱스범위 검색, 정렬 등 다양한 검색에 적합
Hash 인덱스equal(=) 비교에 빠름, 범위 검색에는 부적합
Bitmap 인덱스중복값이 많은 컬럼에 적합 (예: 성별)
Full-Text 인덱스텍스트 검색에 특화 (검색엔진 등)

B-트리 인덱스 (B-Tree Index)

B-트리는 정렬된 데이터를 트리 형태로 저장하는 자료구조
대부분의 관계형 데이터베이스(MySQL, PostgreSQL 등)에서 기본 인덱스로 사용됨
검색, 삽입, 삭제 연산을 평균적으로 O(logn)O(log n)에 수행할 수 있다.

구조예시

                  [30]
                /      \
           [10, 20]   [40, 50]
          /   |   \    /   |   \
       [5] [15] [25] [35] [45] [55]
  • 루트 노드: [30]
  • 내부 노드: [10, 20], [40, 50]
  • 리프 노드: [5], [15], ..., [55]
  • 모든 리프 노드는 같은 깊이에 있음 → 균형 트리

검색 동작

예: WHERE age = 45
→ 루트에서 시작 → 45는 30보다 크므로 오른쪽
→ [40, 50] 에서 45는 40보다 크고 50보다 작으므로 중간 자식으로 이동
→ 리프 노드 [45] 도달 → 검색 성공


인덱스 생성 예시

-- 단일 인덱스
CREATE INDEX idx_users_userid ON users(user_id);

-- 복합 인덱스
CREATE INDEX idx_users_name_email ON users(name, email);

인덱스의 장점

  • 검색 속도 향상: WHERE, JOIN, ORDER BY 절의 성능 향상

  • 정렬 최적화: 정렬이 빠르게 처리됨

  • 조인 성능 향상: 키 기반 검색 속도 증가

인덱스의 단점

  • 쓰기 성능 저하: INSERT/UPDATE/DELETE 시 인덱스도 갱신 필요

  • 디스크 공간 추가 사용: 인덱스를 저장할 공간 필요

  • 인덱스 남용 주의: 너무 많은 인덱스는 오히려 성능 저하


언제 인덱스를 사용해야 할까?

상황인덱스 사용 여부
WHERE 조건에 자주 사용되는 컬럼권장
JOIN에 사용되는 컬럼권장
ORDER BY 또는 GROUP BY 컬럼권장
자주 수정되는 컬럼주의
데이터 분포가 고르지 않은 컬럼조건부 권장

인덱스 조회 계획 확인

  • 인덱스가 실제로 사용되고 있는지 확인하려면 EXPLAIN을 사용
EXPLAIN SELECT * FROM users WHERE user_id = 123;

인덱스 종류 요약

인덱스 종류설명
기본 인덱스 (PK)자동 생성, 유일값 보장
유니크 인덱스 (UNIQUE)중복 방지 목적
보조 인덱스일반 인덱스
복합 인덱스여러 컬럼 조합으로 생성된 인덱스
함수 기반 인덱스함수 결과에 대한 인덱스
파셜 인덱스 (PostgreSQL)특정 조건을 만족하는 값만 인덱싱
profile
Clarinetist.dev

0개의 댓글