피드로 돌아가기
Detective mode: Fixing the MongoDB Aggregation pipeline
Dev.toDev.to
Database

Aggregation Pipeline 순서 변경을 통한 쿼리 성능 20배 향상 (17s → 0.8s)

Detective mode: Fixing the MongoDB Aggregation pipeline

MongoDB Guests2026년 4월 21일8intermediate

Context

단일 필드 추가로 인해 기존 600ms에서 17s로 응답 시간이 급증한 MongoDB 성능 장애 사례임. 대량의 데이터를 대상으로 $lookup을 먼저 수행하여 Nested Loop Join 부하가 발생하고 메모리 부족으로 인한 Disk Spilling이 동반된 구조적 한계가 나타남.

Technical Solution

  • $match 단계의 효율성을 높이기 위해 status와 created_at을 결합한 Compound Index 도입
  • Join 대상 데이터를 최소화하기 위해 $lookup 수행 전 $group과 $sort를 먼저 배치한 데이터 축소 전략 채택
  • $limit를 $lookup 앞에 배치하여 최종 조인 대상 문서 수를 2.5M건에서 100건으로 획기적으로 감소
  • 메모리 한계인 100MB 초과로 인한 usedDisk: true 발생을 방지하기 위해 집계 후 조인 순서로 파이프라인 재설계
  • $project 단계를 마지막에 배치하여 필요한 필드만 최종 추출하는 최적화 경로 구성

1. $lookup 사용 전 $match와 $limit를 통해 조인 대상 데이터 셋을 최소화했는지 확인

2. MongoDB Profiler 및 .explain()을 통해 docsExamined 수치와 indexUsed 여부 검증

3. $group 단계에서 usedDisk: true 발생 시 메모리 100MB 제한 초과 여부 확인 및 튜닝

4. 필터링 조건에 사용되는 다중 필드에 대해 Compound Index 적용 검토

원문 읽기