Basic

[Backend][Basic] SQL 인덱스(Index) 유형과 활용 방법

천재단미 2025. 5. 10. 13:56
728x90
반응형

 

 

 

SQL 데이터베이스에서 인덱스(Index)는 대용량 데이터를 빠르게 검색할 수 있도록 설계된 중요한 자료 구조입니다. 잘 설계된 인덱스는 데이터베이스 성능을 극대화할 수 있지만, 반대로 잘못 설계된 인덱스는 오히려 성능을 저하시키기도 합니다. 이번 글에서는 SQL에서 자주 사용되는 주요 인덱스 유형 다섯 가지와 각 특징을 예시와 함께 설명하겠습니다.


1. 클러스터형 인덱스 (Clustered Index)

정의:

클러스터형 인덱스는 테이블의 물리적 데이터 순서를 인덱스 순서와 동일하게 유지하는 인덱스입니다. 기본 키(Primary Key)를 설정할 때 자동으로 생성되는 경우가 많으며, 테이블에서 하나의 클러스터형 인덱스만 생성할 수 있습니다.

특징:

  • 데이터 정렬: 테이블의 물리적 데이터가 인덱스 순서와 동일하게 정렬됩니다.
  • 빠른 범위 검색: 범위 조회나 정렬에서 매우 빠른 성능을 제공합니다.
  • 저장 효율: 데이터와 인덱스가 함께 저장되므로 별도의 데이터 위치 검색이 필요 없습니다.
  • 단점: 데이터 수정 시 많은 I/O 비용이 발생할 수 있습니다.

예시:

-- 클러스터형 인덱스 생성 (Primary Key로 자동 생성)
CREATE TABLE Employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(50),
    department_id INT
);

-- 데이터가 employee_id를 기준으로 물리적으로 정렬됨

 


 

2. 비클러스터형 인덱스 (Non-Clustered Index)

 

정의:

 

비클러스터형 인덱스는 데이터의 물리적 순서와는 별도로 별도의 구조에 인덱스를 저장하는 방식입니다. 인덱스는 데이터의 포인터를 저장하고 있으며, 하나의 테이블에 여러 개의 비클러스터형 인덱스를 생성할 수 있습니다.

 

특징:

  • 다중 인덱스 지원: 테이블 당 여러 개의 비클러스터형 인덱스를 생성할 수 있습니다.
  • 빠른 검색: 인덱스가 별도로 저장되어 빠른 조회가 가능합니다.
  • 추가 저장 공간 필요: 데이터와 인덱스를 별도로 저장하므로 추가적인 저장 공간이 필요합니다.
  • 범위 검색 비효율: 클러스터형 인덱스에 비해 범위 검색 성능이 떨어질 수 있습니다.

예시:

-- 비클러스터형 인덱스 생성
CREATE INDEX idx_employee_name ON Employees (name);

-- 사용 예시
SELECT * FROM Employees WHERE name = 'Alice';

 


 

3. 고유 인덱스 (Unique Index)

 

정의:

 

고유 인덱스는 인덱스 키 값의 중복을 허용하지 않는 인덱스입니다. 기본 키와 유사하지만, 기본 키는 반드시 Not Null이어야 하는 반면, 고유 인덱스는 Null을 허용할 수 있습니다.

 

특징:

  • 데이터의 유일성 보장: 데이터 중복을 방지하여 데이터의 무결성을 유지합니다.
  • 빠른 검색: 특정 키 값의 조회가 빠릅니다.
  • 쓰기 성능 저하: 데이터 삽입 시 중복 검사로 인해 약간의 성능 저하가 발생할 수 있습니다.

예시:

-- 고유 인덱스 생성
CREATE UNIQUE INDEX idx_employee_email ON Employees (email);

-- 사용 예시
INSERT INTO Employees (employee_id, name, email) VALUES (1, 'John', 'john@example.com');

 


 

4. 복합 인덱스 (Composite Index)

 

정의:

 

복합 인덱스는 두 개 이상의 컬럼을 조합하여 생성한 인덱스입니다. 다중 조건을 포함한 WHERE 절에서 성능을 크게 개선할 수 있습니다.

 

특징:

  • 다중 컬럼 지원: 여러 컬럼의 결합된 키를 기준으로 인덱스를 생성할 수 있습니다.
  • 컬럼 순서 중요: 인덱스 생성 시 지정한 컬럼의 순서에 따라 성능이 크게 달라집니다.
  • WHERE 절 최적화: 다중 조건 쿼리에서 빠른 검색이 가능합니다.

 

예시:

-- 복합 인덱스 생성
CREATE INDEX idx_employee_dept_salary ON Employees (department_id, salary);

-- 사용 예시
SELECT * FROM Employees WHERE department_id = 3 AND salary > 50000;

 


 

5. 전문 검색 인덱스 (Full-Text Index)

 

정의:

 

대용량 텍스트 데이터의 키워드 검색을 빠르게 하기 위해 설계된 인덱스입니다. 일반적인 LIKE 검색보다 훨씬 효율적이며, 자연어 검색을 위한 최적의 인덱스입니다.

 

특징:

  • 대량의 텍스트 데이터에서 빠른 검색
  • 토큰화 및 역색인 구조 사용
  • 특정 키워드 검색에서 강력한 성능

 

예시:

-- 전문 검색 인덱스 생성
CREATE FULLTEXT INDEX idx_blog_content ON Blogs (content);

-- 사용 예시
SELECT * FROM Blogs WHERE MATCH(content) AGAINST('database optimization');

 


 

6. 공간 인덱스 (Spatial Index)

 

정의:

 

지리적 좌표 데이터(예: 위치, 영역)를 효율적으로 검색하기 위한 인덱스입니다. 주로 GIS(Geographic Information System)에서 활용되며, 2차원 공간 데이터를 빠르게 검색하는 데 최적화되어 있습니다.

 

특징:

  • 공간 데이터의 빠른 검색
  • R-Tree와 같은 특수한 데이터 구조 사용
  • 반경 검색, 거리 계산에 강점

 

예시:

-- 공간 인덱스 생성
CREATE SPATIAL INDEX idx_location ON Locations (coordinates);

-- 사용 예시
SELECT * FROM Locations WHERE ST_Contains(area, POINT(37.7749, -122.4194));

 


 

인덱스 선택 시 고려사항

  • 조회 빈도: 자주 조회되는 컬럼에 인덱스를 설정
  • 카디널리티: 중복이 적은 컬럼일수록 효과적
  • 쓰기 비용: 데이터 수정, 삭제가 많은 경우 인덱스 생성에 신중해야 함
  • 조합 인덱스 순서: 자주 사용되는 조건 컬럼을 선행 컬럼으로 배치

 


결론

각 인덱스는 특성이 다르기 때문에 데이터의 특성, 쿼리 패턴, 시스템 구조를 고려하여 적절한 인덱스를 선택하는 것이 중요합니다. 클러스터형 인덱스는 빠른 범위 검색에 유리하며, 비클러스터형 인덱스는 다중 인덱스를 지원하여 복잡한 쿼리에서 성능을 높일 수 있습니다. 고유 인덱스는 데이터의 유일성을 보장하고, 복합 인덱스는 다중 조건에서 탁월한 성능을 제공합니다. 전문 검색 인덱스와 공간 인덱스는 특수한 데이터에서 최고의 성능을 발휘합니다.

728x90
반응형
home top bottom
}