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 は複数のインデックスタイプを提供します

  • 複合インデックスは、1 つのインデックスでさまざまなクエリシェイプをサポートすることで、最大限の柔軟性を提供します。

  • ソート操作とフィルタリング操作を一緒にサポートするようにインデックスを設計する

インデックスプレフィックスを理解する: 複合インデックスはインデックスプレフィックスを介して機能します - 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 */] }

パフォーマンスの向上: ドキュメントが小さいほど、更新が速くなり、メモリ使用量が減少し、キャッシュ効率が向上します。

影響: 非効率的なデータモデリングにより、最適ではないクエリ、ドキュメントサイズの増加、メモリ使用量の増加が発生し、アプリケーションのパフォーマンスが低下し、運用コストが増加します。