인덱스(Index)가 뭐길래 이렇게 중요할까?

Yunsung·2025년 6월 28일
post-thumbnail

데이터베이스 속도가 느릴 때 "인덱스를 만들어야 한다"는 말을 많이 들어보셨나요?
왜 중요한지, 어떻게 동작하는지 몰랐는데 공부해보니 개념이 확실히 잡혀서 정리해봅니다.

1️⃣ 인덱스란?

인덱스(Index)는 데이터를 빠르게 찾기 위해 사용하는 데이터베이스의 자료구조입니다.

📖 영어사전 비유로 이해하기

✅ 영어사전이 없으면:

'Database' 단어 뜻을 찾을 때 처음부터 페이지를 넘겨가며 단어 하나씩 확인해야 함.

✅ 영어사전이 있으면:

알파벳 순으로 정렬되어 있어 D로 시작하는 페이지로 바로 가서 빠르게 찾을 수 있음.

👉 인덱스는 DB에서 바로 '영어사전의 알파벳 순 정렬 기능' 같은 역할을 합니다.


2️⃣ 인덱스의 구조: B-Tree

인덱스는 내부적으로 B-Tree라는 자료구조로 만들어집니다.

B-Tree 특징

  • ✅ 데이터가 정렬된 상태로 유지
  • ✅ 검색 속도가 O(log n) 으로 빠름
  • ✅ 범위 검색에 효율적
  • ✅ 데이터의 삽입/삭제 후에도 균형을 유지해 빠른 검색 가능

🌱 예제와 함께 이해하기

user 테이블 예시

id  | name
----|-------
1   | Alice
2   | Charlie
3   | Bob
4   | David
5   | Eve

name 컬럼으로 인덱스를 생성합니다.

CREATE INDEX idx_user_name ON user(name);

이제 DB는 name 기준으로 정렬된 B-Tree를 만들어 빠르게 탐색할 수 있습니다.

인덱스 검색 시 동작 방식

SELECT * FROM user WHERE name = 'David';

인덱스가 없으면:
Alice → Charlie → Bob → David (최대 n번 확인, O(n))

인덱스가 있으면:
Charlie 기준 비교 → David가 오른쪽 → 오른쪽에서 찾음 (O(log n))

🚀 훨씬 빠르게 데이터를 가져올 수 있습니다.


3️⃣ 인덱스를 왜 만들어야 할까?

✅ 장점

  • 검색 속도 향상 (가장 큰 이유)
  • ORDER BY 시 정렬 속도 향상
  • JOIN, DISTINCT 연산 시 성능 향상 가능

❌ 하지만 주의:

  • 인덱스도 공간을 차지한다
  • 데이터를 삽입/수정/삭제할 때 인덱스도 같이 관리하므로 쓰기 속도가 다소 느려질 수 있다

➡️ 무작정 다 만들지 말고 '자주 검색하거나 정렬/조인에 쓰는 컬럼 위주로 만들 것'이 중요합니다.


4️⃣ 단일 인덱스 / 복합 인덱스 / 유니크 인덱스 언제 사용하면 좋을까?

1) 단일 인덱스 (Single Index)

CREATE INDEX idx_user_email ON user(email);

✅ 언제 사용?

  • WHERE 절에서 특정 컬럼으로 자주 검색할 때
  • 예: 로그인 시 email로 사용자 검색

2) 복합 인덱스 (Composite Index)

CREATE INDEX idx_post_moim_created ON post(moim_id, created_at);

✅ 언제 사용?

  • 여러 컬럼을 조합해 자주 검색하거나 정렬할 때
  • 예: 특정 모임의 게시글을 최신순으로 불러올 때

⚠️ 주의: 컬럼 순서 중요!

moim_id + created_at으로 만들면:

  • WHERE moim_id = ? 검색 + ORDER BY created_at 정렬 시 성능 향상
  • 하지만 WHERE created_at = ? 단독으로는 인덱스 활용 불가

3) 유니크 인덱스 (Unique Index)

CREATE UNIQUE INDEX idx_user_email ON user(email);

✅ 언제 사용?

  • 중복을 방지하면서 검색 속도를 높이고 싶을 때
  • 예: 이메일, 주민번호 등 고유해야 하는 데이터 컬럼

유니크 인덱스를 사용하면:
검색 속도 개선 + 데이터 무결성(중복 방지) 두 가지 효과를 얻을 수 있습니다.


5️⃣ 인덱스 관리 꿀팁

✅ 만드는 것이 좋은 경우

  • 자주 검색되는 컬럼
  • 정렬/그룹핑/조인 기준으로 자주 사용하는 컬럼
  • 고유성이 보장되어야 하는 컬럼

❌ 만들지 않는 것이 좋은 경우

  • 값 종류가 적은 컬럼 (성별, 상태값 등)
  • 자주 업데이트되는 컬럼
  • 데이터가 적어 전체 검색해도 부담이 없을 때

🎯 마무리

인덱스는 데이터베이스의 검색 속도를 비약적으로 높여주는 강력한 도구입니다.

그러나:

  • 무조건 다 만드는 것이 아니라,
  • 실제 사용 패턴과 쿼리에 맞춰 필요한 컬럼에만 적용해야 진짜 성능 개선이 됩니다.

저도 공부하면서 인덱스를 처음엔 "그냥 만드는 거 아니야?"라고 생각했는데, 인덱스의 구조와 동작 방식, 장단점을 정확히 이해하고 나니 성능 최적화를 보는 눈이 생겼습니다.

여러분도 프로젝트 DB 성능 개선할 때 인덱스를 적절히 활용해 보세요! 🚀

profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글