데이터베이스 인덱스란?
데이터베이스 인덱스는 책의 색인처럼 데이터를 빠르게 검색할 수 있도록 돕는 구조입니다. 인덱스를 사용하면 WHERE, JOIN, ORDER BY 절에서 데이터를 효율적으로 탐색할 수 있습니다. 하지만 인덱스 자체도 데이터로 저장되기 때문에 용량을 차지하며, 무조건적으로 모든 컬럼에 인덱스를 추가하는 것은 오히려 비효율적일 수 있습니다.
인덱스의 주요 특징
- 인덱스는 특정 컬럼을 기반으로 데이터를 정렬하여 검색 속도를 높입니다.
- 인덱스가 적용된 컬럼을 WHERE 절로 검색하지 않으면 인덱스가 사용되지 않습니다.
- SELECT 성능은 향상되지만, CREATE, UPDATE, DELETE 연산에서는 추가적인 성능 비용이 발생합니다.
인덱스의 구조
- B-Tree:
- 기본적으로 데이터베이스 인덱스는 B-Tree 구조를 사용합니다.
- B-Tree는 이진 탐색 트리와 연결 리스트의 장점을 결합하여 데이터 탐색을 빠르게 수행합니다.
- Balanced-Tree:
- 트리의 높이가 균형을 이루며, 각 노드는 자식 노드를 2개 이상 가질 수 있습니다.
- 이러한 구조는 인덱스 검색에서 일정한 시간 복잡도를 보장합니다.
클러스터링 인덱스와 논클러스터링 인덱스
- 클러스터링 인덱스:
- 테이블당 하나만 존재할 수 있습니다.
- 데이터를 인덱스 순서에 따라 정렬하므로 데이터 자체가 인덱스의 역할을 합니다.
- 주로 PRIMARY KEY에 적용됩니다.
- 논클러스터링 인덱스:
- 한 테이블에 여러 개를 생성할 수 있습니다.
- 데이터를 정렬하지 않고, 인덱스와 실제 데이터를 별도로 저장합니다.
- UNIQUE KEY에 주로 사용됩니다.
인덱스의 활용 기준
- 카디널리티: 중복 값이 적고, 고유 값이 많은 컬럼(카디널리티가 높은 컬럼)에 인덱스를 적용해야 효과적입니다.
- 사용 빈도: WHERE, JOIN, ORDER BY 절에서 자주 사용되는 컬럼에 인덱스를 설정해야 합니다.
- 데이터 변경 빈도: 데이터 변경이 잦은 컬럼에 너무 많은 인덱스를 설정하면, 성능 저하가 발생할 수 있습니다.
복합 인덱스란
복합 인덱스는 두 개 이상의 컬럼을 조합하여 하나의 인덱스를 생성하는 데이터베이스 인덱스입니다. 단일 인덱스(Single Column Index)가 하나의 컬럼만 인덱싱하는 것과 달리, 복합 인덱스는 특정 쿼리 조건에 맞는 데이터를 더 효율적으로 조회하기 위해 여러 컬럼을 결합한 인덱스입니다.
ex) 복합 인덱스 (A, B, C)
- 하나의 인덱스가 세 개의 컬럼을 조합하여 정렬된 상태로 저장됩니다.
- 인덱스는 왼쪽부터 순차적으로 사용되므로, 컬럼 순서가 매우 중요합니다.
1. A만 사용하는 경우
WHERE A = ?
2. A와 B를 함께 사용하는 경우
WHERE A = ? AND B = ?
3. A, B, C를 모두 사용하는 경우
WHERE A = ? AND B = ? AND C = ?
4. A와 B를 사용하면서 C는 정렬 조건으로 사용하는 경우
WHERE A = ? AND B = ? ORDER BY C