데이터 베이스/데이터베이스 기본

Ch07. 인덱스 - 인덱스 소개

webmaster 2026. 6. 4. 22:32

다시 책의 비유로 돌아가 보자. 우리는 책에서 특정 단어를 찾을 책을 처음부터 읽지 않는다. 책의 뒤에 있는 "아보기(색인)" 페이지를 활용한다.

 

"찾아보기" 페이지는 어떻게 구성되어 있는가?

  1. 책의 중요한 키워드들이 알파벳순, 가나다순(정렬된 순서)으로 정리되어 있다.
  2. 키워드 옆에는 키워드가 등장하는 페이지 번호 적혀 있다.

그런데 여기서 중요한 점이 있다. 우리는 찾아보기 페이지를 보고 어떻게 빨리 데이터를 찾을 있을까? 바로 중요한 키워드들이 가나다순(정렬된 순서)로 정리되어 있기 때문이다!

 

인덱스는 특정 컬럼(들)의 데이터를 기반으로 생성되는, 원본 테이블과는 별개의 특수한 자료 구조다.

  • 인덱스는 지정된 컬럼(예: item_name)의 값과, 해당 값을 가진 실제 데이터 행의 위치(예: 주소값, 포인터, PK 값 ) 쌍으로 저장한다.
  • 가장 중요한 것은, 인덱스 내부의 데이터는 항상 정렬된 상태를 유지한다는 점이다.

item_name 기반의 인덱스

Item Index(일부 생략)

  • "item_name"이 가나다라 순으로 정렬되어 있는 것을 확인할 수 있다.
  • 정렬된 순서를 보면 숫자, 영문, 가나다라 순으로 정렬된다.
    • 4K UHD 모니터
    • SQL 마스터 가이드
    • 관계형 데이터베이스 입문
  • 이렇게 정렬된 상태면 사람도 원하는 데이터를 빨리 찾을 있듯이 데이터베이스도 원하는 데이터를 빨리 찾을 있다.
    • 정렬된 데이터에서 데이터베이스가 원하는 데이터를 어떻게 빨리 찾을 있는지 원리는 뒤에서 설명한.

인덱스 동작 과정

  • 원본 데이터의 위치에는 해당 값을 가진 실제 데이터 행의 위치(: 주소값, 포인터, PK ) 저장한다. 통해 원본 데이터에 빠르게 접근할 있다.
    • 예시에서는 보기 쉽게 편의상 PK 값을 적어두었다. 실제로 저장되는 값은 데이터베이스와 인덱스의 종류에 따라서 다르다.
select * from items where item_name = '게이밍 노트북';
  1. "items" 테이블 전체를 순서대로 스캔하는 대신, 먼저 "item_name" 기반의 인덱스를 찾아간다.
  2. 인덱스는 정렬되어 있으므로, "게이밍 노트북"이라는 값을 아주 빠르게 찾아낸다. (원리는 뒤에서 설명)
  3. 찾아낸 인덱스 항목에서 실제 데이터 행의 위치를 확인한다.
  4. 위치를 이용해 원본 테이블의 해당 위치로 점프해서, 단번에 원하는 데이터를 가져온다. (예시에서는 편의상 PK 값을 적어두었지만 해당 행의 실제 위치 값을 가지고 있다고 생각하면 된다.)

인덱스 덕분에 100 번의 비교 작업이 번의 작업으로 줄어들게 된다. 데이터가 1 건으로 늘어나도 검색 속도는 거의 차이가 나지 않을 정도로 비약적인 성능 향상이 일어난다.

 

실제 인덱스의 구현

특정 데이터베이스 시스템(: MySQL) 종속된 복잡한 구현 세부사항은 다루지 않고, 일반적이고 논리적인 인덱스의 개념을 중심으로 설명한다. 참고로 실제 물리적인 인덱스는 종류에 따라 구현이 다르다

 

예를 들어 "MySQL" 경우 "클러스터 인덱스(Clustered Index)" "보조 인덱스(Secondary Index)"라는 2가지 종류의 인덱스를 제공한다.

  • 클러스터 인덱스는 기본 키(PK)를 기반으로 만드는 인덱스이다. 클러스터 인덱스는 원본 데이터 자체를 인덱스에 함께 보관해서 원본 데이터를 매우 빠르게 찾을 있다.
  • 보조 인덱스는 원본 데이터의 기본 (PK) 값을 함께 보관한다. 그리고 기본 (PK) 값으로 클러스터 인덱스를 통해 원하는 데이터를 조회한다.

 

이처럼 인덱스의 종류에 따라 내부 동작 방식은 다양하지만, 핵심적인 목적은 변함없이 데이터 검색 속도를 향상시키고 쿼리 성능을 최적화하는 것이다. 마치 책의 목차나 찾아보기가 특정 내용을 빠르게 찾을 있도록 돕는 것처럼, 데이터 베이스 인덱스는 방대한 양의 데이터 속에서 필요한 정보를 효율적으로 찾아낼 있도록 돕는 특별한 데이터 구조라고 이해하면 된다.

 

지금 단계에서는 "특정 컬럼을 정렬해서 저장하고, 이를 통해 원본 데이터에 빠르게 접근할 있는 특별한 목차"라는 인덱스의 그림을 이해하면 충분하다.