DBMS/개념

15_ 인덱스(Index)

seungwon-1 2025. 10. 7. 15:06

오늘은 데이터베이스 성능 최적화에서 핵심이라고 할 수 있는 인덱스(Index) 개념을 정리했다.
데이터가 많아질수록 검색 속도가 느려지는 게 당연하지만, 인덱스를 잘 활용하면 훨씬 빠르게 원하는 데이터를 찾을 수 있다.


1. 인덱스란 무엇인가?

인덱스는 말 그대로 책의 색인과 같은 역할을 한다.
데이터베이스 테이블에서 원하는 데이터를 빠르게 찾을 수 있도록 도와주는 별도의 데이터 구조다.

즉, 전체 테이블을 처음부터 끝까지 훑는 Full Table Scan을 피하고,
인덱스가 제공하는 검색 경로를 통해 빠르게 데이터 위치를 찾아간다.

 인덱스는 특정 컬럼(혹은 여러 컬럼 조합)에 대해 만들어지고,
내부적으로 별도의 자료구조로 관리된다.

 

 

2. 인덱스의 동작 원리

대부분의 데이터베이스는 인덱스를 B-트리(B-Tree) 또는 B+트리(B+Tree) 구조로 관리한다.
이 구조는 정렬된 상태를 유지하면서, 검색·삽입·삭제를 빠르게 수행할 수 있다.

B-트리 / B+트리의 특징

  • 균형 트리 구조: 모든 리프 노드가 같은 깊이에 위치한다.
  • 탐색 효율이 좋다. (O(log n))
  • B+트리는 모든 데이터가 리프 노드에만 저장된다. 내부 노드는 인덱싱만 담당.

검색 과정 요약

  1. 루트 노드에서 시작해 원하는 키를 비교하며 내려감
  2. 리프 노드에 도달하면, 해당 데이터의 실제 위치(포인터)를 얻음
  3. 포인터를 통해 테이블의 실제 데이터를 읽음

 

3. 인덱스의 장단점

 장점

  • 검색 속도 향상
    원하는 데이터를 빠르게 찾을 수 있어 쿼리 성능이 비약적으로 개선된다.
  • 정렬 비용 감소
    인덱스가 이미 정렬된 상태이기 때문에 ORDER BY가 포함된 쿼리에서도 유리하다.
  • MIN / MAX 함수 최적화
    첫 번째 혹은 마지막 인덱스 값만 보면 된다.
  • 조인 성능 향상
    조인 키에 인덱스가 있으면 조인 연산이 훨씬 빨라진다.

 단점

  • 추가 저장공간 필요
    인덱스도 별도의 데이터 구조이므로 공간이 필요하다.
  • 쓰기 성능 저하
    INSERT, UPDATE, DELETE 시 인덱스도 함께 수정되어야 하므로 오버헤드가 생긴다.
  • 관리 필요
    주기적인 재구성(REBUILD)과 통계 업데이트가 필요하다.
  • 잘못된 인덱스는 오히려 독
    불필요하거나 중복된 인덱스는 쿼리 최적화를 방해할 수 있다.

 

4. 인덱스 생성과 관리

인덱스 생성 예시

CREATE INDEX idx_employee_name ON employees(last_name, first_name);

자주 검색되는 컬럼에 인덱스를 만들어야 효과가 크다.
무조건 많이 만든다고 좋은 게 아니라, 쿼리 패턴을 분석하고 선택도(Selectivity)를 고려해야 한다.

관리 포인트

  • 정기적인 재구성(REBUILD)
    데이터 변경이 잦으면 인덱스 구조가 비효율적으로 변할 수 있다.
  • 통계 업데이트
    옵티마이저가 최신 정보를 바탕으로 실행 계획을 세우도록 유지한다.
  • 불필요한 인덱스 제거
    사용 빈도가 낮거나 중복되는 인덱스는 과감히 삭제.

 

5. 검색 성능을 높이는 전략

  1. WHERE 절 컬럼에 인덱스 생성
    자주 사용되는 조건문 컬럼에 인덱스를 만들면 검색 속도가 크게 개선된다.
  2. 복합 인덱스 사용
    여러 컬럼이 함께 쓰이는 쿼리는 복합 인덱스로 효율화 가능
    단, 컬럼 순서가 매우 중요하다. (왼쪽부터 사용해야 효율적)
  3. 인덱스 재구성과 통계 업데이트
    주기적으로 실행하여 인덱스 효율 유지
  4. 쿼리 최적화
    인덱스 컬럼에 함수나 연산을 사용하면 인덱스가 무용지물이 될 수 있다.
  5. 선택도 고려
    중복이 적고 고유한 값이 많은 컬럼에 인덱스를 두면 효과가 좋다.
  6. 부분 인덱스(Partial Index)
    특정 조건을 만족하는 데이터만 인덱싱해서 공간 절약과 성능 향상을 동시에 노릴 수 있다.

 

6. 실습 예시

-- 1. 테이블 생성
CREATE TABLE employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100),
    hire_date DATE
);

-- 2. 대량 데이터 삽입
INSERT INTO employees (id, first_name, last_name, email, hire_date)
SELECT 
    generate_series,
    md5(random()::text)::varchar(50),
    md5(random()::text)::varchar(50),
    md5(random()::text)::varchar(100),
    current_date - (random() * 3650)::integer
FROM generate_series(1, 1000000);

-- 3. 인덱스 없이 검색
EXPLAIN ANALYZE SELECT * FROM employees WHERE last_name = 'Smith';

-- 4. 인덱스 생성
CREATE INDEX idx_employees_last_name ON employees(last_name);

-- 5. 다시 검색 후 실행 시간 비교
EXPLAIN ANALYZE SELECT * FROM employees WHERE last_name = 'Smith';

이렇게 실행 계획을 비교하면 인덱스가 검색 속도에 얼마나 영향을 주는지 눈으로 확인할 수 있다.

 

7. 정리

인덱스는 데이터베이스 성능을 결정짓는 핵심 요소다.
하지만 “많이 만든다고 좋은 것”이 아니라,
쿼리 패턴, 데이터 특성, 업데이트 빈도를 모두 고려해야 한다.

인덱스 설계 시 고려할 점

  • 자주 쓰이는 쿼리 패턴 파악
  • 선택도 높은 컬럼 우선
  • 데이터 분포와 조건 고려
  • 정기적인 관리(재구성, 통계 업데이트)

올바른 인덱스 설계는 검색 성능 향상뿐 아니라
전체 시스템 효율에도 큰 영향을 준다.

 

'DBMS > 개념' 카테고리의 다른 글

17_ 뷰(view)  (0) 2025.10.11
16_ 트랜잭션 (Transaction)  (0) 2025.10.09
14_ NULL과 NVL() 함수  (0) 2025.10.05
13_ 시퀀스  (0) 2025.10.03
12_ ALTER문  (0) 2025.10.01