db index

agnusdei·2025년 5월 5일

Database

목록 보기
20/76

1. 정의 (Definition)

인덱스(Index) 는 데이터베이스 테이블에서 데이터 검색 속도를 향상시키기 위한 보조적인 데이터 구조입니다.
일반적으로 책의 목차나 색인처럼, 원하는 정보를 빠르게 찾기 위해 사용됩니다.

목적: 빠른 검색, 정렬, JOIN 성능 향상
단점: 저장 공간 증가, 쓰기(INSERT/UPDATE/DELETE) 성능 저하


2. 필요성 (Why Index?)

인덱스 없을 때인덱스 있을 때
테이블 전체를 순차 검색 (Full Scan)원하는 위치를 빠르게 찾아서 접근 (Index Scan)
속도 느림 (O(n))속도 빠름 (O(log n) or better)
CPU·I/O 낭비 큼리소스 절약

3. 인덱스의 구조 (Structure)

대표적인 인덱스 구조: B-Tree (Balanced Tree)

  • 대부분의 DBMS는 B-Tree 또는 B+Tree 인덱스를 기본 제공
  • **정렬된 키(key)**와 포인터를 통해 검색 속도를 높임
[Root]
  |
[Internal Node]
  |
[Leaf Node] → 실제 레코드 위치(ROWID 등) 연결
  • 검색 시간: O(log n)
  • 균형 유지를 통해 삽입/삭제 시에도 성능 안정적

4. 인덱스의 종류 (Type of Indexes)

분류 기준종류설명
기본/보조Primary Index기본키에 자동 생성되는 인덱스
Secondary Index다른 컬럼에 수동 생성하는 인덱스
유일성Unique Index중복을 허용하지 않는 인덱스
복합성Composite Index여러 컬럼을 조합한 인덱스
구조B-Tree Index가장 일반적인 균형 트리
Bitmap Index0/1 비트맵으로 다중값 표현 (분포도 낮은 경우 유리)
Hash Index해시 함수 기반 (정확한 값 검색에 적합)
파티션Local/Global Index파티셔닝 테이블에 적용되는 특수 인덱스
함수형Function-Based Index함수 결과값에 인덱스 (예: UPPER(name))
전문검색Full Text Index텍스트 기반 검색 최적화 (LIKE, CONTAINS 등)

5. 인덱스 설계 시 고려사항

[1] 인덱스를 적게 만들 것

  • 인덱스는 읽기는 빠르지만, 쓰기는 느리게 함
  • 과도한 인덱스는 DML 성능 저하

[2] 선택도(Selectivity) 고려

  • 선택도 = 고유값의 비율
  • 선택도가 높은 컬럼 (ex: 주민번호, 사번)에 인덱스 효과 큼

[3] 컬럼 순서 주의

  • 복합 인덱스는 선두 컬럼 기반으로만 탐색 가능

    예: (A, B, C) 인덱스는 A로 검색은 가능하지만 B만으로는 불가

[4] 갱신 빈도 고려

  • 자주 변경되는 컬럼에는 인덱스 최소화

6. 인덱스 관련 튜닝 기법

기법설명
인덱스 힌트 사용USE INDEX, FORCE INDEX 등으로 옵티마이저 유도
인덱스 리빌드조각화(fragmentation) 방지를 위해 재정렬
Covering Index인덱스 컬럼만으로 SELECT 가능한 경우 (Table Access 생략)
Partitioned Index대용량 데이터에서 파티션 기반 인덱스

7. 실무 예시

-- 기본 인덱스 생성
CREATE INDEX idx_emp_deptno ON emp(deptno);

-- 복합 인덱스
CREATE INDEX idx_emp_name_dept ON emp(name, deptno);

-- 함수 기반 인덱스
CREATE INDEX idx_upper_name ON emp(UPPER(name));

8. 인덱스 성능 확인

  • EXPLAIN PLAN 또는 DBMS_PROFILER 등을 사용해 인덱스 사용 여부 확인
  • 실행계획에서 INDEX RANGE SCAN, INDEX FULL SCAN, FULL TABLE SCAN 등을 분석

어린이 버전 요약

인덱스는 책의 찾아보기처럼, 필요한 정보를 빨리 찾게 해주는 지도예요.
너무 많이 만들면 오히려 느려지고 복잡하니까, 똑똑하게 만들어야 해요!


profile
DevSecOps Pentest🚩

0개의 댓글