[DB] 인덱스

do_it·2025년 11월 20일

database

목록 보기
10/11

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)이 필요하므로, 클러스터형 인덱스보다 검색 속도가 약간 느릴 수 있음.

0개의 댓글