[SQL] 인덱스(INDEX)란?

kt·2025년 2월 16일

데이터베이스에서 인덱스를 적절히 활용하면 SQL 성능이 비약적으로 향상될 수 있습니다!

인덱스의 개념부터 권장 설정 방법까지 알아보겠습니다.🤓


1. 인덱스란 무엇인가?

인덱스(Index)는 데이터를 효율적으로 검색하고 쿼리 성능을 최적화하기 위해 사용하는 자료 구조입니다.
도서관의 책 목차 또는 사전의 단어 찾기 방식과 유사합니다.

[동작 방식]

  • 인덱스가 없는 경우: Full Table Scan(전체 테이블을 검색) 수행 → 느림🐢
  • 인덱스를 사용하는 경우: B-Tree 또는 Hash Table을 활용하여 검색 최적화 → 빠름🐇
(예제)
-- 인덱스 없이 검색 (느림, Full Table Scan 발생)
SELECT * FROM employees WHERE name = 'amugae';

-- 인덱스를 사용하여 검색 최적화 (빠름, Index Scan 수행)
CREATE INDEX idx_employee_name ON employees(name);
SELECT * FROM employees WHERE name = 'amugae';

2. 장단점

✅ 장점

  1. 검색 속도 향상
    • WHERE, ORDER BY, GROUP BY, JOIN 연산에서 큰 성능 개선 효과
    • 범위 검색 (BETWEEN, <, >) 최적화
    • 데이터 정렬 비용 감소 (ORDER BY 최적화)

⚠️ 단점

  1. INSERT, UPDATE, DELETE 성능 저하 (쓰기 연산 비용 증가)
    • 데이터가 변경될 때마다 인덱스도 함께 수정되므로 성능 저하 발생
    • 너무 많은 인덱스는 오히려 성능 저하
  2. 저장 공간 증가
    • 인덱스는 테이블과 별도로 저장되므로 추가적인 디스크 공간이 필요함
    • 데이터가 많아질수록 인덱스 크기도 증가하여 유지 비용이 발생

3. 종류별 특징

  • 각 DBMS마다 지원하는 인덱스 유형이 다를 수 있으며, 목적에 맞게 적절한 인덱스를 선택하는 것이 중요합니다.

4. 생성/수정/삭제 쿼리

✅ 인덱스 생성 (CREATE INDEX)

  • 기본 인덱스 (B-TREE)
    CREATE INDEX 인덱스명 ON 테이블명(컬럼명);

  • 복합(Composite) 인덱스 (두 개 이상의 컬럼 포함)
    CREATE INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2);

  • 함수 기반(Function-Based) 인덱스 (Oracle)
    CREATE INDEX 인덱스명 ON 테이블명(LOWER(컬럼명));

  • BITMAP INDEX (Oracle)
    CREATE BITMAP INDEX 인덱스명 ON 테이블명(컬럼명);

  • CLUSTERED INDEX (MSSQL)
    CREATE CLUSTERED INDEX 인덱스명 ON 테이블명(컬럼명);

✅ 인덱스 수정 (REBUILD, RENAME)

  • 인덱스 재구성
    ALTER INDEX 인덱스명 REBUILD;

  • 인덱스 이름 변경 (MSSQL)
    SP_RENAME '기존 인덱스명', '변경할 인덱스명', 'INDEX';

✅ 인덱스 삭제 (DROP INDEX)

DROP INDEX 테이블명.인덱스명;


5. 인덱스 설정 시 주의 사항

1) 인덱스가 많다고 무조건 좋은 게 아닌 것을 명심하기

  • 너무 많은 인덱스는 INSERT, UPDATE, DELETE 성능 저하
  • 읽기 성능 vs 쓰기 성능의 균형 필요
  • 인덱스는 추가적인 저장 공간을 차지하므로 신중하게 사용

2) 자주 변경되는 컬럼에는 인덱스 사용 주의하기

  • UPDATE가 많으면 인덱스도 함께 수정되어 오버헤드 발생

3) LIKE '%문자%' 검색에서는 B-Tree 인덱스가 비효율적 → FULLTEXT INDEX 활용

4) 작은 테이블에서는 인덱스가 불필요할 수도 있다.

  • 작은 테이블(수천 건 이하)에서는 풀 테이블 스캔이 더 빠를 수 있음

6. 권장하는 설정 방법

1) WHERE, JOIN, ORDER BY에 자주 사용되는 컬럼에 인덱스 추가
2) 데이터 변경이 많은 컬럼은 인덱스를 최소화
3) 테이블의 크기와 조회 패턴을 분석 후 인덱스 추가
4) 인덱스 재구성으로 성능 유지 관리
5) 불필요한 인덱스는 제거하여 유지 비용 최소화


📌 결론

인덱스는 SQL 성능 최적화에서 필수적인 요소이지만, 잘못 사용하면 오히려 성능 저하를 초래할 수 있습니다.
효율적인 인덱스 활용을 위해 꼭 필요한 컬럼에만 적용하고, 주기적으로 성능을 점검하는 것이 중요합니다.

profile
기록하는 블로그

0개의 댓글