

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 성능 개선 팁
<a name="performance-improvement-tips"></a>

이 섹션에서는 Amazon DocumentDB가 애플리케이션 효율성과 쿼리 실행을 개선하기 위한 5가지 성능 최적화 전략을 제공합니다.

## 1. 집계 파이프라인에서 $match를 첫 번째 단계로 사용
<a name="tip-match-first-stage"></a>

성능을 극대화하려면 항상 $match를 집계 파이프라인에서 필터링하는 첫 번째 단계로 배치하세요. Amazon DocumentDB는 $match가 파이프라인을 리드할 때 인덱스를 효과적으로 활용하므로 데이터베이스가 데이터를 조기에 필터링하고 처리 오버헤드를 줄일 수 있습니다.

```
// Optimized approach
db.orders.aggregate([
  { $match: { status: "active", category: "electronics" } }, // Index utilization
  { $group: { _id: "$category", total: { $sum: "$price" } } },
  { $sort: { total: -1 } }
])
```

**영향:** 조기 필터링은 후속 파이프라인 단계에서 처리되는 문서 수를 줄여 쿼리 실행 속도를 높이고 리소스 소비를 줄입니다.

## 2. 집계 파이프라인에서 $project를 사용하여 파이프라인 데이터 크기 최소화
<a name="tip-project-minimize-data"></a>

집계 파이프라인 단계를 통해 필수 필드만 가져와 데이터 크기를 최소화하고 성능을 개선합니다. $project를 전략적으로 사용하여 필요한 데이터만 포함합니다.

```
// Efficient pipeline design
db.orders.aggregate([
  { $match: { orderDate: { $gte: new Date("2024-01-01") } } },
  { $project: { customerId: 1, totalAmount: 1, status: 1 } }, // Only needed fields
  { $group: { _id: "$customerId", totalSpent: { $sum: "$totalAmount" } } }
])
```

**영향:** 문서가 작을수록 메모리 사용량이 줄어들고 파이프라인 처리 효율성이 향상되어 전반적인 쿼리 성능이 향상됩니다.

## 3. 문서 압축을 활성화하여 스토리지 비용 절감, I/O 비용 절감 및 쿼리 성능 향상
<a name="tip-document-compression"></a>

클러스터 파라미터 그룹에서 문서 압축을 활성화하여 스토리지 비용, I/O 비용을 절감하고 쿼리 성능을 높입니다. Amazon DocumentDB는 압축된 문서를 디스크와 RAM에 저장하여 메모리 공간 및 I/O 비용을 줄입니다.

**영향:**
+ 사용 가능한 메모리에 맞는 더 많은 문서
+ 디스크 읽기 감소로 데이터 액세스 속도 향상
+ 스토리지 비용 절감, I/O 비용 절감, 쿼리 성능 향상

**참고**  
Amazon DocumentDB는 버전 5.0에 대해 기본적으로 압축을 활성화하지 않습니다. 5.0 클러스터에 대해 컬렉션 또는 클러스터 수준에서 [압축을 활성화](doc-compression.md)할 수 있습니다. Amazon DocumentDB의 압축 검토 유틸리티를 사용하여 컬렉션의 압축 비율을 분석할 수 있습니다.  
Amazon DocumentDB 8.0의 경우 [압축이 기본적으로 활성화됩니다](dict-compression.md).

## 4. 최적의 쿼리 성능을 위한 인덱스 활용
<a name="tip-leverage-indexes"></a>

최적의 성능을 위해 쿼리가 항상 인덱스를 활용하는지 확인합니다. Amazon DocumentDB는 다양한 사용 사례에 맞게 여러 인덱스 유형을 제공합니다.

**인덱싱 원칙:**
+ 모든 쿼리는 적절한 인덱스를 활용해야 합니다.
+ Amazon DocumentDB는 여러 [인덱스 유형을](index-types.md) 제공합니다.
+ 복합 인덱스는 단일 인덱스로 다양한 쿼리 셰이프를 지원하여 유연성을 극대화합니다.
+ 정렬 및 필터링 작업을 함께 지원하는 인덱스 설계

**인덱스 접두사 이해:** 복합 인덱스는 인덱스 접두사를 통해 작동합니다. Amazon DocumentDB는 인덱스 필드의 모든 left-to-right으로 하위 집합을 사용할 수 있습니다. 예를 들어 인덱스는 다음과 같은 사용 가능한 접두사를 `{ category: 1, price: -1, inStock: 1 }` 생성합니다.
+ `{ category: 1 }` - 범주별 쿼리 필터링만 지원
+ `{ category: 1, price: -1 }` - 범주별 쿼리 필터링 및 가격별 정렬/필터링 지원
+ `{ category: 1, price: -1, inStock: 1 }` - 전체 복합 쿼리 지원

가격, inStock 또는 inStock에 대한 쿼리만 첫 번째 필드(범주)로 시작하지 않으므로이 인덱스를 사용하지 않습니다.

**인덱스를 사용하지 않는 쿼리를 식별하는 방법:** explain() 메서드를 사용하여 쿼리 실행을 분석하고 인덱스를 사용하는 대신 컬렉션 스캔을 수행하는 쿼리를 식별합니다.

**영향:** 인덱스 사용률이 없는 쿼리는 컬렉션 스캔을 초래하여 인스턴스에 대한 메모리 및 CPU 압력 증가와 쿼리 지연 시간 증가를 초래합니다.

## 5. 쿼리 패턴을 기반으로 데이터 모델 최적화
<a name="tip-optimize-data-models"></a>

애플리케이션 쿼리 및 업데이트 방식에 맞게 데이터 모델을 조정합니다. 데이터 모델링은 고성능 Amazon DocumentDB 애플리케이션의 기반입니다.

**최적화 전략:**

**성능을 위한 임베딩**
+ 단위로 자주 액세스할 때 관련 데이터를 함께 저장
+ 항상 함께 검색되는 문서 임베드
+ one-to-few 관계에 적합

```
// Embedded approach for frequently accessed data
{
  _id: ObjectId("..."),
  customerName: "John Doe",
  address: {
    street: "123 Main St",
    city: "Seattle",
    zipCode: "98101"
  },
  recentOrders: [
    { orderId: "ORD001", amount: 99.99, date: "2024-01-15" }
  ]
}
```

**유연성에 대한 참조**
+ 대규모 또는 자주 액세스하지 않는 데이터에 대한 참조 사용
+ 대규모 데이터 세트와의 one-to-many 관계에 권장됩니다.
+ 문서 팽창을 방지하고 업데이트 성능을 개선합니다.

**컬렉션 분할 전략**

대용량 문서의 일부 필드만 자주 업데이트되거나 자주 액세스하지 않는 대용량 데이터 팽창 문서가 있는 경우 컬렉션을 분할하는 것이 좋습니다.
+ 자주 업데이트되는 필드를 별도의 소규모 컬렉션에 보관
+ 정적 데이터 또는 자주 액세스하지 않는 데이터를 다른 컬렉션에 저장
+ 필요할 때 참조와 연결

```
// Before: Large document with mixed access patterns
{
  _id: ObjectId("..."),
  productId: "PROD123",
  name: "Wireless Headphones",        // Frequently accessed
  price: 99.99,                      // Frequently accessed
  inventory: 45,                     // Updated frequently
  lastSold: "2024-01-15",           // Updated frequently
  detailedSpecs: { /* large object */ }, // Infrequently accessed
  manualPDF: "base64...",           // Large, rarely accessed
  reviewHistory: [/* large array */] // Infrequently accessed
}

// After: Split into collections based on access patterns
// products collection (frequently accessed data)
{
  _id: ObjectId("..."),
  productId: "PROD123",
  name: "Wireless Headphones",
  price: 99.99,
  inventory: 45,
  lastSold: "2024-01-15"
}

// product_details collection (infrequently accessed data)
{
  _id: ObjectId("..."),
  productId: "PROD123",           // Reference to products collection
  detailedSpecs: { /* large object */ },
  manualPDF: "base64...",
  reviewHistory: [/* large array */]
}
```

**성능 향상:** 문서가 작을수록 업데이트 속도가 빨라지고 메모리 사용량이 줄어들며 캐시 효율성이 향상됩니다.

**영향:** 비효율적인 데이터 모델링으로 인해 쿼리가 최적화되지 않고 문서 크기가 증가하며 메모리 사용량이 증가하여 애플리케이션 성능이 저하되고 운영 비용이 증가합니다.