📌 데이터베이스 검색 방식: 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을 유도하려면? → 쿼리가 아니라 인덱스를 미리 설정해두는 것!
쿼리는 동일하되, 데이터베이스가 내부적으로 최적화 경로를 선택합니다.
'기술블로그-Fastapi편' 카테고리의 다른 글
📌 EdgeQL 반복 삽입 코드 완전 분석 (0) | 2025.05.28 |
---|---|
📌 데이터베이스 인덱스(Index)와 B-Tree 구조 정리 (0) | 2025.05.28 |
📌 EdgeQL 쿼리 패턴 완전 정복 (0) | 2025.05.28 |
📌 EdgeDB 마이그레이션 꼬임 해결: 전체 초기화 루틴 (0) | 2025.05.28 |
📌 WSL + VS Code 연동 및 'code' 명령어 설정 방법 정리 (0) | 2025.05.28 |