나만의 학습 기록

최종 목적은 기술 블로그💩

백엔드 공부

더 깊은 데이터베이스 지식 (5) - 인덱스와 작동 원리

밈밍민믹 2026. 4. 19. 18:26

안녕하세요. 벌써 내일이면 다시 월요일이네요. 일주일이 너무 빨리 지나가는 것 같아요. 다들 월요병 화이팅!

저번시간에는 데이터베이스의 정규화에 대해서 배웠습니다. 이번 시간에는 인덱스와 작동 원리에 대해서 학습해보도록 하겠습니다.


인덱스

데이터베이스 테이블의 검색 속도를 향상시키기 위해 별도의 데이터 구조에 데이터와 위치 정보를 정렬하여 저장하는 기술

  • 주로 B-Tree 기반으로 동작한다.
  • 책의 맨 뒤에 있는 색인처럼 원하는 데이터를 더 빨리 찾도록 도와주는 구조이다.

 

데이터가 적을 경우에는 전체 테이블을 조회해도 큰 문제가 없습니다. 하지만 데이터가 많아질수록 필요한 행 하나를 찾기 위해 모든 행을 확인하는 비용이 커지게 됩니다. 그렇기에 인덱스를 사용하여 특정 컬럼 값을 기준으로 정렬된 탐색 경로를 만들어서 검색 범위를 줄일 필요가 존재합니다.

 

그렇다면, 앞서 얘기했듯이 주로 B-Tree를 기반으로 동작한다고 했는데, 이외에도 Hash, Bitemap, Faull-Text Index 등 다양한 구조가 존재합니다. 그 중 가장 대표적인 B-Tree의 동작 원리를 이해하는 것이 인덱스를 정확히 이해하는 데 도움이 됩니다.

 

B-Tree 동작 원리

데이터베이스와 파일 시스템에서 많이 사용하는 균형 트리 구조입니다. 많은 양의 데이터를 저장하더라도, 특정 값을 빠르게 탐색할 수 있도록 만든 자료구조입니다. 

일반적인 이진 트리처럼 한 노드가 자식 2개만 가지는 것이 아니라, 하나의 노드가 여러 개의 키와 여러 개의 자식 노드를 가질 수 있다는 점이 특징입니다.

 

즉, B-Tree는 데이터를 한 줄로 차례대로 찾는 방식이 아니라, 트리 구조를 통해 탐색 범위를 빠르게 줄여 나가는 방식으로 동작합니다.

 

다음과 같은 B-Tree를 예시로 설명해보겠습니다.

탐색 과정 - 30을 찾는 경우

  • 먼저 루트 노드의 20, 40을 비교했을 때 30은 20이상 40미만이므로 가운데 자식 노드로 이동합니다.
  • 가운데 자식 노드에는 25,32가 있으므로, 다시 25이상 32 미만 구간을 따라 내려갑니다.
  • 그 결과 리프 노드에서 27, 30이 있는 구간에 도달하고, 30을 찾게 됩니다.

 

이처럼 B-Tree는 각 노드의 키 값을 기준으로 탐색 범위를 점차 줄여 나가며 원하는 값을 찾습니다. 데이터베이스 인덱스도 바로 이러한 방식으로 동작합니다. 즉, 특정 컬럼에 인덱스를 생성하면 DBMS는 해당 컬럼 값을 B-Tree 구조로 정리해두는거죠.

조회 시 해당 트리를 따라 필요한 값의 위치를 빠르게 탐색합니다.

 

그렇다면 인덱스에서는 실제로 어떻게 동작하는지 알아볼까요?

인덱스의 동작원리

예를 들어 다음과 같은 쿼리가 실행된다고 가정해보겠습니다.

SELECT name FROM table WHERE age = 22;

이때 데이터베이스는 age 컬럼에 인덱스가 존재한다면 테이블의 모든 데이터를 처음부터 끝까지 확인하지 않고 먼저 인덱스에서 age = 22의 위치를 탐색합니다.

 

  • WHERE age = 22 조건이 들어오면, DBMS는 age 인덱스의 루트 노드부터 탐색합니다.
  • 루트 노드에서 22가 포함될 수 있는 구간을 판단한 뒤, 해당 자식 노드로 이동합니다.
  • 하위 노드에서도 같은 방식으로 범위를 좁혀 내려가 22-B에 도달합니다.
  • B는 실제 데이터가 저장된 위치 정보로 B가 가리키는 실제 데이터에 접근하여 name 값인 철수를 조회합니다.

이처럼 인덱스를 사용하면 원하는 데이터의 위치를 더 빠르게 찾을 수 있습니다. 그렇다면 인덱스를 사용하는 가장 큰 장점은 무엇일까요?

 

인덱스의 장단점

장점

  • 조회 속도 향상
  • 모든 행을 하나씩 확인하는 Full Table Scan 감소
  • 범위 검색과 정렬에 유리
  • 조인 성능 향상 가능
  • 대용량 데이터에서 효과가 크다.

단점

  • 추가 저장 공간이 필요하다.
  • INSERT, UPDATE, DELETE 과 같은 작업의 성능이 저하될 수 있다.
  • 잘못 설계하면 오히려 비효율적이다.
  • 데이터가 적으면 효과가 미미하다.
  • 중복이 많은 컬럼에서는 효율이 저하될 수 있다.

 

그렇다면 인덱스는 언제 사용하는 것이 가장 좋을까요?

기준 인덱스 사용이 효과적인 경우 인덱스 사용이 비효율적일 수 있는 경우
조회 빈도 조건 검색이 자주 발생하는 컬럼 거의 조회되지 않는 컬럼
데이터 양 데이터가 많아 전체 탐색 비용이 큰 테이블 데이터가 적어 Full Scan 부담이 작은 테이블
중복도 값의 종류가 다양하고 중복이 적은 컬럼 값을 중복이 많아 선택도가 낮은 컬럼
사용 목적 WHERE, JOIN, ORDER BY에 자주 사용되는 컬럼 검색, 정렬, 조인에 거의 사용되지 않는 컬럼
변경 빈도 조회가 많고 변경이 상대적으로 적은 컬럼 INSERT, UPDATE, DELETE가 매우 잦은 컬럼
기대 효과 탐색 범위를 줄여 조회 성능 향상 인덱스 유지 비용으로 성능 이점이 줄어들 수 있음

이상으로 인덱스에 대해서는 이정도만 정리하도록 하겠습니다. CS 카테고리에 앞으로 추가할 내용들과 겹치는 내용들이 많아서 해당 내용들에다가 링크를 달 예정입니다. 백엔드 공부 페이지가 초입이고, CS가 상세한 내용 정도라고 이해하시면 좋으실 것 같습니다. 이상으로 더 깊은 데이터베이스 지식은 마무리 되었습니다. 다음 시간에는 API에 대해서 대략 5편에 걸쳐서 설명할 예정입니다. 다들 월요일 화이팅 하시고, 월요일날 글로 뵙겠습니다. 수고하셨습니다.