1. 인덱스
1-1. 인덱스란 무엇인가?
1) 인덱스의 정의와 역할
- 인덱스는 DB 테이블에 대한 검색 성능을 높이기 위해 특별한 자료구조로 구성된 매커니즘
- 마치 책의 목차나 색인과 같이, 원하는 데이터를 찾기 위해 테이블 전체를 훑어볼(Full Table Scan) 필요 없이 빠르게 해당 데이터가 위치한 곳을 찾아줌.
- 핵심 역할은 I/O(Input/Output) 횟수를 줄이는 것, 디스크 I/O는 성능 저하의 주범이므로, 이를 줄여 검색 속도를 획기적으로 향상시킴.
2) 왜 인덱스를 사용하는가?
- 검색 속도 향상
- 특정 조건에 맞는 데이터를 찾을 때, 인덱스를 사용하면 테이블의 특정 범위만 빠르게 탐색할 수 있음.
- 정렬 및 그룹화 용이
- 데이터를 정렬 (ORDER BY)하거나 그룹화(GROUP BY)할 때 이미 인덱스 자체가 정렬된 상태이므로, 별도의 정렬 작업 없이 인덱스를 활용하여 처리 속도를 높임.
- 고유성 보장
NIQUE 인덱스를 설정하면 해당 컬럼의 데이터 중복을 방지하여 데이터의 무결성을 보장할 수 있음
3) 인덱스가 CRUD 성능에 미치는 영향
인덱스는 검색(Read) 성능은 높여주지만, 데이터 변경(Write) 작업에는 추가 비용을 발생시킴.
인덱스가 많아질수록 검색(Read) 성능은 좋아지지만, 삽입/수정/삭제(Write) 시의 부하가 커지므로, 테이블 전체적인 작업 부하를 고려하여 적절한 개수와 컬럼에만 인덱스를 설정해야 함.
- CREATE (삽입)
- 새로운 데이터가 삽입될 때, 데이터 레코드뿐만 아니라 인덱스 페이지에도 새로운 키를 삽입하는 작업이 추가로 발생함.
- READ
- 인덱스를 통해 필요한 레코드에 빠르게 접근하므로, 가장 큰 성능 이점을 얻는 작업임.
- UPDATE
- 인덱스가 설정된 컬럼의 값이 변경될 경우, 기존 인덱스를 삭제하고 새로운 인덱스를 삽입하는 두 가지 작업이 발생하여 비용이 큼.
- DELETE
- 데이터 레코드를 삭제하고, 해당 레코드에 대한 인덱스 항목도 함께 삭제해야 하므로 추가 작업이 필요함.
1-2. 클러스터형 인덱스 & 비클러스터형 인덱스
DB에서 데이터를 저장하고 찾는 방식에 따라 인덱스는 크게 클러스터형과 비클러스터형으로 나뉨.
이 둘은 데이터의 물리적 정렬 방식과 인덱스 리프 노드에 무엇이 저장되는지에 차이가 있음.
| 구분 | 클러스터형 인덱스 (Clustered Index) | 비클러스터형 인덱스 (Non-Clustered Index) |
|---|
| 물리적 정렬 | O (데이터 자체가 인덱스 순서로 정렬됨) | X (인덱스만 정렬되고, 데이터는 임의의 위치에 저장됨) |
| 개수 제한 | 테이블당 1개만 가능 | 테이블당 여러 개 생성 가능 |
| 리프 노드 | 실제 데이터 레코드 (데이터가 곧 인덱스) | 데이터의 위치를 가리키는 포인터(주소값) |
| 장점 | 검색 속도가 가장 빠름 (특히 범위 검색) | 유연하게 여러 컬럼에 생성 가능, 삽입/수정 부하 상대적으로 적음 |
| 단점 | 삽입/수정 시 데이터 정렬 부하 큼 | 데이터를 찾기 위해 추가적인 Lookup 필요 |
| 주요 사용처 | 기본 키(Primary Key) | 외래 키(Foreign Key)나 자주 검색되는 컬럼 |
클러스터형 인덱스 (Clustered Index)
-
정의 & 특징
- 테이블의 물리적인 데이터 행을 인덱스 키 값의 순서대로 정렬하여 저장하는 방식
- 데이터 자체가 묶여 한 가지 방식으로만 물리적으로 정렬되어서 저장됨.
- 테이블당 오직 하나만 생성할 수 있음.
- 대부분의 DB에서는 PK를 지정하면 자동으로 클러스터형 인덱스가 생성됨.
-
구조적 특징
- 인덱스의 리프 노드가 곧 실제 데이터 레코드 자체임.
- 인덱스를 탐색하는 것 자체가 실제 데이터에 도달하는 것을 의미함.
-
장점
- 인덱스 검색 후 추가적인 데이터 조회 과정이 필요 없어 검색 속도가 매우 빠름
- 데이터가 이미 순서대로 물리적으로 인접하게 저장되어 있기 때문에 범위 검색(Range Query)에 매우 효율적임.
-
단점
- 데이터 삽입 밑 수정 시. ㅔ이터의 물리적 위치를 재정렬해야 하는 경우가 생겨 부하가 큼.
- 인덱스의 크기가 곧 테이블의 크기와 같기 때문에 인덱스를 생성하는 데 시간이 오래 걸림.
비클러스터형 인덱스 (Secondary/Non-Clustered Index)
-
정의 & 특징
- 데이터의 물리적 정렬과는 별개로, 인덱스만 따로 정렬하여 관리하는 방식
- 테이블당 여러 개를 생성할 수 있음
- PK가 아닌 일반 컬럼에 생성하는 모든 인덱스가 여기에 해당됨.
-
구조적 특징
- 인덱스의 리프 노드에는 데이터 레코드 자체가 아닌, 해당 데이터를 찾을 수 있는 주소값(포인터)이 저장됨.
- MySQL InnoDB: 클러스터형 인덱스의 기본 키 값이 주소값으로 저장됨.
- SQL Server 등: 물리적 위치 주소(RID)나 클러스터 키 값 등이 저장됨.
- 따라서 검색 과정은 인덱스 검색 → 주소값 획득 → 데이터 레코드 재조회 (Lookup)의 2단계로 이루어짐
-
장점
- 데이터 삽입 / 수정 시 데이터 레코드의 물리적 위치를 변경할 필요가 없어 클러스터형 인덱스보다 부하가 적음.
- 테이블당 여러 개를 만들 수 있어 다양한 컬럼 조합으로 검색 성능을 높일 수 있음.
-
단점
- 인덱스를 통해 데이터의 주소를 얻은 후 실제 데이터를 다시 한 번 찾아가는 추가적 작업(Lookup)이 필요하므로, 클러스터형 인덱스보다 검색 속도가 약간 느릴 수 있음.