기술블로그-Fastapi편

📌 데이터베이스 검색 방식: Seq Scan vs Index Scan 정리

Chansman 2025. 5. 28. 14:09

📌 데이터베이스 검색 방식: Seq Scan vs Index Scan 정리

데이터베이스는 쿼리를 실행할 때, 테이블에서 데이터를 어떻게 읽을지 자동으로 결정합니다. 이때 사용되는 대표적인 두 가지 방식이 바로 Sequential Scan(Seq Scan)과 Index Scan입니다.


✅ 1. Seq Scan (Sequential Scan / Table Scan)

🧾 개념

  • 테이블의 모든 행을 처음부터 끝까지 순차적으로 읽는 방식
  • 인덱스를 사용하지 않음

📦 특징

  • 빠르게 설정되고, 간단한 쿼리 계획
  • 작은 테이블이나 인덱스가 없는 컬럼에서 유리
  • 대용량 테이블에서는 느릴 수 있음

📉 예시 상황

SELECT * FROM users WHERE name = 'Alice';

→ name 컬럼에 인덱스가 없다면 → Seq Scan 실행


✅ 2. Index Scan (인덱스 스캔)

🧾 개념

  • 조건에 맞는 값을 찾기 위해 먼저 인덱스를 조회한 후, 해당 위치의 실제 데이터를 테이블에서 읽는 방식
  • B-Tree 등으로 구성된 인덱스를 사용

📦 특징

  • 조건에 부합하는 데이터만 읽으므로 빠름
  • WHERE, JOIN, ORDER BY 조건에 자주 사용됨
  • 디스크 접근이 두 번 일어나므로, 선택도가 낮을 경우에는 오히려 비효율적일 수도 있음

📈 예시 상황

SELECT * FROM users WHERE email = 'test@example.com';

→ email 컬럼에 인덱스가 있다면 → Index Scan 실행


✅ 3. SQL 문법은 동일하다!

  • SELECT, WHERE 등의 쿼리는 동일
  • 인덱스 스캔을 사용하려면 스키마에 인덱스를 미리 선언해두어야 함

📌 PostgreSQL 인덱스 선언

CREATE INDEX idx_users_email ON users(email);

📌 EdgeDB 인덱스 선언 방식 (두 가지)

✅ 방식 1: 속성 내부에서 정의 (단순 필드 인덱스에 적합)

type Movie {
  required title: str {
    index;
  }
}

✅ 방식 2: 타입 내부에서 별도 선언 (복합 또는 표현식 기반 인덱스에 적합)

type Movie {
  title: str;
  multi actors: Person;
  index on (.title);
}

→ 쿼리를 바꾸지 않아도, 인덱스가 존재하면 자동으로 Index Scan 사용


🧠 실행 계획 확인

DB가 어떤 방식으로 데이터를 읽었는지 확인하려면 실행 계획을 보면 됩니다.

PostgreSQL 예시:

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

출력 결과:

  • Seq Scan on users
  • 또는 Index Scan using idx_users_email on users

📊 비교 요약

항목 Seq Scan Index Scan

읽는 방식 테이블 전체 순회 인덱스 → 테이블 포인터
성능 느림 (대용량 시) 빠름 (선택도 높을 때)
인덱스 필요 ❌ 없음 ✅ 필요
사용 조건 인덱스 없음, 소규모 WHERE, JOIN, 정렬에 적합

💡 실무 팁

  • 무조건 인덱스를 많이 만들면 오히려 성능 저하 (쓰기 성능에 영향)
  • 자주 검색되는 조건, JOIN 대상 필드에만 인덱스 적용
  • 쿼리 튜닝 시 EXPLAIN 분석은 필수

📌 Index Scan을 유도하려면? → 쿼리가 아니라 인덱스를 미리 설정해두는 것!
쿼리는 동일하되, 데이터베이스가 내부적으로 최적화 경로를 선택합니다.