⚡ 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) → 테스트 → 튜닝의 반복
도움 되셨다면 공감/구독도 부탁드립니다 😊
'NoSQL > MongoDB' 카테고리의 다른 글
[MongoDB] RDBMS DBA 관점에서의 MongoDB 커리큘럼 (0) | 2025.04.25 |
---|---|
[MongoDB] MongoDB 운영 중 자주 발생하는 문제와 실전 대응법 (0) | 2025.04.20 |
[MongoDB] MongoDB DBA가 꼭 챙겨야 할 관리 포인트 정리 (0) | 2025.04.19 |
[MongoDB] MongoDB OpLog 변경하기 (0) | 2025.04.18 |
[MongoDB] MongoDB 기본기, RDBMS와 비교하며 쉽게 이해하기 (0) | 2025.04.18 |