View a markdown version of this page

성능 개선 팁 - Amazon DocumentDB

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

성능 개선 팁

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

1. 집계 파이프라인에서 $match를 첫 번째 단계로 사용

성능을 극대화하려면 항상 $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를 사용하여 파이프라인 데이터 크기 최소화

집계 파이프라인 단계를 통해 필수 필드만 가져와 데이터 크기를 최소화하고 성능을 개선합니다. $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 비용 및 쿼리 성능 향상을 위한 문서 압축 활성화

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

영향:

  • 사용 가능한 메모리에 맞는 더 많은 문서

  • 디스크 읽기 감소로 데이터 액세스 속도 향상

  • 스토리지 비용 절감, I/O 비용 절감, 쿼리 성능 향상

참고

Amazon DocumentDB는 버전 5.0에서 기본적으로 압축을 활성화하지 않습니다. 5.0 클러스터에 대해 컬렉션 또는 클러스터 수준에서 압축을 활성화할 수 있습니다. Amazon DocumentDB의 압축 검토 유틸리티를 사용하여 컬렉션의 압축 비율을 분석할 수 있습니다.

Amazon DocumentDB 8.0의 경우 압축이 기본적으로 활성화됩니다.

4. 최적의 쿼리 성능을 위한 인덱스 활용

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

인덱싱 원칙:

  • 모든 쿼리는 적절한 인덱스를 활용해야 합니다.

  • Amazon DocumentDB는 여러 인덱스 유형을 제공합니다.

  • 복합 인덱스는 단일 인덱스로 다양한 쿼리 셰이프를 지원하여 유연성을 극대화합니다.

  • 정렬 및 필터링 작업을 함께 지원하는 인덱스 설계

인덱스 접두사 이해: 복합 인덱스는 인덱스 접두사를 통해 작동합니다. 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. 쿼리 패턴을 기반으로 데이터 모델 최적화

애플리케이션 쿼리 및 업데이트 방식에 맞게 데이터 모델을 조정합니다. 데이터 모델링은 고성능 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 */] }

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

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