hanker

SQL - 인덱스(index) 사용법, 종류, 정의 본문

DATABASE/SQL

SQL - 인덱스(index) 사용법, 종류, 정의

hanker 2025. 1. 5. 00:00
반응형

SQL에서 인덱스(Index)는 데이터베이스의 검색 속도를 높이는 데 중요한 역할을 한다.

그러나 잘못된 인덱스 설정은 성능을 저하시킬 수 있다.

이번 글에서는 인덱스의 정의, 종류, 그리고 효과적으로 사용하는 방법을 알아보자.


1. 인덱스란?

 

인덱스는 책의 색인처럼 데이터베이스에서 특정 데이터를 빠르게 찾을 수 있도록 돕는 구조이다.

 

- 인덱스가 없다면 데이터베이스는 모든 행을 하나씩 탐색하는 풀 스캔(Full Scan)을 수행한다.

- 인덱스는 테이블의 특정 열에 대해 정렬된 데이터를 저장하여 검색 속도를 높인다.


2. 인덱스의 작동 원리

 

인덱스는 B-tree 구조 또는 해시(Hash)를 기반으로 작동한다.

 

- B-tree 인덱스: 대부분의 데이터베이스에서 기본적으로 사용하는 인덱스 유형으로, 범위 검색에 유리하다.

- 해시 인덱스: 고유 값 검색에 특화되어 있지만, 범위 검색은 지원하지 않는다.

특성 B-Tree 인덱스 해시 인덱스
구조 균형 트리 해시 테이블
지원 연산 =, <, <=, >, >= 등 =만 지원
정렬 정렬된 데이터 유지 정렬되지 않음
범위 검색 가능 불가능
검색 성능 O(log⁡N)O(\log N) O(1)O(1) (충돌 없음 가정)
적용 사례 범위 쿼리, 정렬이 필요한 작업 정확한 키 검색 (키-값 매핑에 적합)

 

 

* 범위 검색이 필요한 경우: B-Tree 인덱스

* 정확한 키 검색이 필요한 경우: 해시 인덱스

 

 


3. 인덱스의 종류

 

3.1 기본 키 인덱스 (Primary Key Index)

기본 키는 자동으로 인덱스를 생성하며, 중복과 NULL 값을 허용하지 않는다.

 

 

3.2 유니크 인덱스 (Unique Index)

고유 인덱스는 중복 값을 허용하지 않는다.

CREATE UNIQUE INDEX unique_idx ON employees (email);

 

 

3.3 일반 인덱스 (Non-Unique Index)

중복 값을 허용하며, 검색 속도를 높이기 위해 사용된다.

CREATE INDEX idx_name ON employees (last_name);

 

 

3.4 복합 인덱스 (Composite Index)

여러 열을 결합하여 하나의 인덱스를 생성한다.

CREATE INDEX idx_fullname ON employees (last_name, first_name);

 

 

3.5 클러스터링 인덱스 (Clustered Index)

테이블의 데이터 자체를 정렬하며, 하나의 테이블에 하나의 클러스터링 인덱스만 생성할 수 있다.


4. 인덱스 사용 사례

 

4.1 WHERE 절에 사용

SELECT * FROM employees WHERE last_name = 'Ker';
# 인덱스가 있는 경우 last_name 열을 기준으로 빠르게 데이터를 검색한다.

 

 

4.2 JOIN 절에 사용

SELECT E.name, D.department_name 
FROM employees E 
JOIN departments D 
    ON E.department_id = D.department_id;
# JOIN 조건 열에 인덱스를 추가하면 테이블 결합 성능이 향상된다.

 

 

4.3 ORDER BY와 GROUP BY에 사용

SELECT last_name FROM employees ORDER BY last_name;
# 인덱스가 있으면 정렬 속도가 향상된다.

 


5. 인덱스 생성 시 주의사항

 

과도한 인덱스 생성 금지

- 인덱스가 많아지면 삽입, 업데이트, 삭제 성능이 저하된다.

- 필요한 열에만 인덱스를 생성하는게 좋다.

 

인덱스 선택 열

- 자주 검색되거나 JOIN 조건에 사용되는 열에 인덱스를 생성한다.

 

인덱스와 데이터 크기

- 데이터 크기가 작거나 테이블의 행 수가 적다면 인덱스 효과가 미미할 수 있다.

 

고유 값과 중복도

- 인덱스는 고유 값이 많을수록 효과적이다.

- 중복 값이 많으면 성능 향상이 제한적입이다.


6. 인덱스 성능 분석

 

6.1 실행 계획 확인

데이터베이스는 EXPLAIN 명령어를 사용해 실행 계획을 확인할 수 있다.

EXPLAIN SELECT * FROM employees WHERE last_name = 'ker';

 

 

6.2 인덱스 사용 여부 확인

인덱스가 사용되지 않는 경우, 실행 계획에서 Full Table Scan이 표시됩니다.


7. 인덱스 최적화 팁

 

단일 열보다는 복합 인덱스 활용

- last_name과 first_name으로 검색이 자주 이루어진다면 복합 인덱스를 생성하자

 

인덱스와 쿼리 조건의 일치

- 쿼리 조건이 인덱스 순서와 일치해야 최적의 성능을 얻을 수 있다.

 

가급적 SELECT * 지양

- SELECT *는 인덱스를 효과적으로 활용하지 못할 가능성이 높다.

 

정기적인 인덱스 리빌드

- 데이터베이스 성능을 유지하려면 정기적으로 인덱스를 재구성(Rebuild)하자


SQL에서 인덱스는 성능을 극대화하는 핵심 도구이다.

하지만 모든 경우에 인덱스가 유리한 것은 아니므로, 데이터와 쿼리 패턴에 맞는 전략적 사용이 필요하다.

반응형