⚡ MongoDB 성능 튜닝 실전편: 인덱스 전략과 Aggregation Pipeline 최적화


MongoDB가 느려지는 원인의 90%는 잘못된 인덱스 구성비효율적인 Aggregation Pipeline 때문입니다.
이번 포스트에서는 쿼리 성능을 극적으로 올릴 수 있는 핵심 튜닝 전략을 실전 중심으로 소개합니다.


1️⃣ 인덱스(Index) 전략

✅ 기본 원칙

  • 항상 조회 조건(where)에 사용되는 필드는 인덱싱
  • 정렬(sort)에 자주 쓰이는 필드도 인덱스 고려
  • 복합 인덱스는 조건 사용 빈도 + 필드 순서가 중요

📌 단일 vs 복합 인덱스

// 단일 인덱스
db.users.createIndex({ age: 1 })

// 복합 인덱스 (조건 + 정렬)
db.users.createIndex({ age: 1, createdAt: -1 })

🧠 인덱스가 작동하지 않는 경우

  • 조건과 인덱스 순서가 다를 때
  • 복잡한 $or / $regex 조합
  • Aggregation에서 $project를 먼저 쓰는 경우

🔍 실행 계획 확인

db.users.find({ age: 30 }).explain("executionStats")
  • COLLSCAN: 전체 Collection 스캔 → 성능 저하
  • IXSCAN: 인덱스 사용 → OK

2️⃣ 인덱스 튜닝 실전 예제

🧪 문제 상황

db.orders.find({
  status: "shipped",
  createdAt: { $gte: ISODate("2023-01-01") }
}).sort({ createdAt: -1 })

이 쿼리가 느리다면?

✅ 해결 전략

  • 복합 인덱스 생성
db.orders.createIndex({ status: 1, createdAt: -1 })
📌 WHERE → SORT 순서대로 인덱스 필드 배치하는 게 핵심입니다.

 


3️⃣ Aggregation Pipeline 최적화

Aggregation은 강력하지만, 성능 병목도 자주 발생하는 영역입니다.

⚠️ 자주 발생하는 비효율 구조

db.sales.aggregate([
  { $project: { total: { $multiply: ["$price", "$qty"] } } },
  { $match: { total: { $gt: 100 } } }
])

$project → $match 순서는 인덱스를 사용할 수 없습니다.

✅ 올바른 순서

db.sales.aggregate([
  { $match: { price: { $gt: 10 } } },
  { $project: { total: { $multiply: ["$price", "$qty"] } } }
])
  • 인덱스 가능한 조건은 $match로 먼저 걸어야 성능 확보 가능
  • 필터 → 가공 → 정렬 → 그룹 순서로 설계

4️⃣ $group 최적화 팁

대규모 데이터 집계에서 $group은 가장 느린 연산입니다.

💡 최적화 전략

  • group 전에 가능한 한 match/filter로 줄이기
  • allowDiskUse: true 옵션으로 메모리 초과 방지
db.logs.aggregate([
  { $match: { level: "ERROR" } },
  { $group: { _id: "$service", count: { $sum: 1 } } }
], { allowDiskUse: true })

 


 

5️⃣ 성능 튜닝 종합 체크리스트

  • ✅ 모든 쿼리는 .explain() 으로 실행계획 확인
  • ✅ 인덱스는 조회 조건 + 정렬 순서 기반으로 설계
  • ✅ Aggregation은 $match → $project → $sort → $group 순서 지키기
  • 복합 인덱스는 자주 사용하는 쿼리 패턴 중심으로

📌 추천 도구

  • MongoDB Compass → 쿼리 분석 + 인덱스 추천
  • Atlas Performance Advisor → 인덱스 자동 추천
  • mongostat / mongotop → 실시간 부하 확인

✅ 마무리 요약

  • 인덱스 전략은 MongoDB 성능의 핵심!
  • Aggregation은 설계 순서와 필터링 범위가 성능을 좌우
  • 쿼리 튜닝은 분석(Explain) → 테스트 → 튜닝의 반복

도움 되셨다면 공감/구독도 부탁드립니다 😊

+ Recent posts