인덱싱 및 성능
공유하기:
인덱싱 및 성능
1. 인덱스 유형 (Index Types)
- 단일 필드 (Single Field): 하나의 필드에 대해 생성.
- 복합 인덱스 (Compound Index): 두 개 이상의 필드를 조합. 필드의 순서가 중요함.
- 멀티키 (Multikey): 배열 필드 내의 요소들을 인덱싱.
- TTL (Time-To-Live): 특정 시간 후 문서를 자동으로 삭제 (날짜 필드 대상).
- 텍스트 (Text): 문자열의 키워드 검색 지원.
- 해시 (Hashed): 필드 값을 해싱하여 저장. 주로 샤드 키로 사용.
2. 쿼리 최적화와 Explain Plan
쿼리 성능을 분석하기 위해 .explain() 메소드를 사용합니다.
- COLLSCAN: 전체 컬렉션 스캔 (인덱스 없음 - 성능 저하).
- IXSCAN: 인덱스 스캔 (효율적).
- Covered Query: 데이터 원본에 접근하지 않고 인덱스만으로 쿼리 결과 반환.
3. ESR (Equality, Sort, Range) 규칙
복합 인덱스 생성 시 필드 배치 순서의 황금률입니다.
- Equality: 정확히 일치하는 필드를 가장 앞에.
- Sort: 정렬 기준 필드를 중간에.
- Range: 범위 쿼리(lt 등) 필드를 마지막에.
4. 실습 명령어
// 인덱스 생성 (1: 오름차순, -1: 내림차순)
db.users.createIndex({ age: 1 })
// 복합 인덱스 생성
db.users.createIndex({ name: 1, age: -1 })
// 생성된 인덱스 확인
db.users.getIndexes()
// 실행 계획 확인
db.users.find({ age: 25 }).explain("executionStats")5. 시험 팁 (Certification Tips)
- Covered Query의 조건을 암기하세요 (인덱스에 모든 필드 포함 & _id 미출력 등).
- 복합 인덱스에서 선행 필드가 포함되지 않은 쿼리는 해당 인덱스를 활용할 수 없습니다.
- TTL 인덱스는 고정 기간 데이터 유지 관리에 필수적입니다.
6. 베스트 프랙티스
- 과도한 인덱스 생성은 쓰기 작업 부하를 증가시킵니다. 쓰기와 읽기 비율을 고려하세요.
- 메모리(RAM)에 인덱스가 모두 올라올 수 있도록 관리하는 것이 중요합니다.