멀티캠퍼스

데이터베이스 Index

isaacagent 2025. 8. 19. 00:26
728x90

index, 데이터베이스에서 검색을 진행할 때 테이블 전체를 일일이 조회를 하지않고, 데이터를 빠르게 검색할 수 있도록 돕는 특별한 자료구조이다. 테이블의 특정 컬람 값을 정렬된 형태로 별도의 공간에 저장을 해서 검색을 효율적으로 하게한다. 그리고 주로 구조는 B-트리나 해시 형태로 구현이 되어있다.

WHERE, JOIN, ORDER BY, GROUP BY 절에서 성능 개선 효과가 크고, 검색, 정렬, 범위 조회 등이 빨라진다. 하지만 인덱스 생성에는 추가 저장 공간이 요구되고, 데이터 값 변경(삽입, 수정, 삭제) 시에도 인덱스를 갱신해야되서 약간의 성능 저하가 발생 될 수 있다. 마지막으로 너무 많은 인덱스를 생성하면 오히려 성능이 떨어진다는 단점이 존재한다. 

클러스터 인덱스, 논클러스터 인덱스, 유니크 인덱스, 풀텍스트 인덱스 등 다양한 인덱스가 존재하지만 주로 클러스터 인덱스와 논 클러스터 인덱스에 대해서만 다룰 것이다.


클러스터 인덱스(Clustered Index)

테이블의 데이터가 디스크에 물리적으로 정렬되어 저장되는 인덱스이다. 즉, 인덱스가 곧 데이터의 저장 구조 자체를 나타내고, 인덱스의 리프 노드가 실제 데이터 페이지인 것이다. 

그림 1. B+트리 인덱스 구조

상위 노드(루트/브랜치)가 인덱스 역할을 하고 있고, 하위 노드(리프/데이터 페이지)가 실제 데이터 행을 저장하는 구조를 띄고 있다. 이런 형태의 인덱스는 테이블 당 하나만 생성이 가능하다. 일반적으로 PRIMARY KEY로 자동 생성이 된다. 데이터가 인덱스 키 순서에 따라 디스크에 정렬이 되어있기 때문에, 범위 검색과 정렬이 매우 빠르다.

물리적으로 정렬이 되어있기 때문에 검색 속도는 논클러스터 인덱스보다 빠르다. 하지만 데이터 삽입, 삭제 , 수정 시에는 물리적인 데이터 이동과 정렬 유지가 필요해서 리소스를 잡아먹어 성능적으로 약간 저하가 될 수 있다.

그림 2.Primary key 기준으로 클러스터 인덱스 생성

SHOW INDEX FROM student;

student_id를 통해서 인덱스가 생성 되어있음을 확인할 수 있다.

그림 3. 생성된 클러스터 인덱스
그림 4. 인덱스를 활용한 검색 1
그림 5. 인덱스를 이용한 검색 2

인덱스를 이용해서 이름을 바로 반환해주고, 범위 위치를 파악해서 Leaf Level의 값들을 바로 갖고 올 수 있다.


논 클러스터 인덱스(Non Clustered Index)

데이터가 물리적으로 정렫되어 저장되지 않고, 인덱스가 별도의 공간에 저장되어있는 인덱스를 칭한다.

그림 6. 논클러스터 인덱스 구조

레코드의 원본은 정렬이 되어있지는 않고, 인덱스 페이지만 정렬이 된다. 즉, 논클러스터 인덱스는 데이터 페이지를 건들이지 않고, 별도의 장소에 인덱스 페이지(Root Level)를 생성한다. 인덱스 페이지의 리프 페이지에 Index로 구성한 열을 정렬한 후 위치 포인터를 생성한다. 즉, 논클러스터 인덱스의 인덱스 페이지는 키값(데이터페이지의 위치, RID)과 데이터가 위치하는 포인터(데이터 페이지의 인덱스, Row ID)로 되어있다. 그렇게 데이터 검색 시 엔덱스 페이지를 탐색한 후 실제 데이터 페이지를 조회하는 2단계의 과정을 거친다. 데이터의 삽입, 수정, 삭제 시 인덱스 갱신이 있지만 클러스터 인덱스보단 부담이 덜 한다.

해당 형태의 인덱스는 여러 개의 인덱스를 생성할 수 있다. 여러 인덱스로 다양한 컬럼에 대한 빠른 검색이 가능해진다. 그리고 데이터 테이블 구조를 크게 바꾸지 않고도 인덱스를 추가할 수 있다. 반면 검색은 그래도 2단계를 거치다보니 클러스터 인덱스보단 살짝 느린 편이다. 그리고 인덱스를 계속 늘려가면 DML과정에서 부담이 증가하게 된다. 

그림 7. 논클러스터 인덱스 예시

인덱스 리프에서 데이터 위치정보를 저장하고, 데이터 페이지에서 실제 값을 조회하는 구조로 되어있다.

CREATE INDEX idx_name ON country(name);

그림 8. 생성된 논클러스터 인덱스

데이터가 실제로 name 기준 정렬이 되어 저장이 되어있진 않고, 인덱스 트리의 리프 노드에는 name + id들이 저장되어있는 형태로 되어있다.

 


더 다양한 인덱스 종류들이 있지만 일단 제일 유명한 인덱스 두 가지를 복기하는 글을 작성하였다. 추후에 더 많은 인덱스 종류를 알아 보도록 할 것이다.

'멀티캠퍼스' 카테고리의 다른 글

Servlet MVC 실습 코드 리뷰  (0) 2025.09.01
서블릿 기초  (1) 2025.08.25
데이터베이스 (DDL)  (2) 2025.08.12
UML(Unified Modeling Language)과 클래스 다이어그램(Class Diagram)  (2) 2025.08.06
(Java)abstract, interface  (6) 2025.08.04