クエリのパフォーマンスの最適化
低速なクエリのトラブルシューティングを行うには、Query Explain を使用して、クエリ実行プランとランタイム実行プロファイルを取得します。次のセクションでは、実行プロファイルに応じてクエリ パフォーマンスを最適化する手順について説明します。
結果の個数を制限する
実行ツリーの返されたレコードのフィールドを使用して、クエリが多くのドキュメントを返しているかどうかを確認します。$limit
句を使用して、返されるドキュメントの数を制限することを検討してください。これにより、ネットワーク経由でクライアントに返される結果のシリアル化されたバイトサイズが小さくなります。Limit
ノードの前に MajorSort
ノードがある場合、クエリエンジンでは Limit
ノードと MajorSort
ノードを統合し、完全なインメモリ実体化と並べ替えを TopN 並べ替えに置き換えて、クエリのメモリ要件を削減できます。
結果のドキュメントのサイズを制限する
不要なフィールドの取得を避けるため、$project
句を使用して、返されるドキュメントのサイズを制限することを検討してください。こうすることで、中間結果の処理にかかるコンピューティング コストとメモリコスト、およびネットワーク経由でクライアントに返される結果のシリアル化されたバイトサイズを削減できます。クエリで参照されるすべてのフィールドが通常のインデックス(マルチキーではない)でカバーされている場合、クエリはインデックス スキャンで完全にカバーされるため、プライマリ ストレージからドキュメントを取得する必要がなくなります。
インデックスを使用する
次の手順でインデックスを設定して最適化します。
クエリでインデックスが使用されているかどうかを確認する
クエリがインデックスを使用しているかどうかは、実行ツリーのリーフノードを確認することで特定できます。実行ツリーのリーフノードが TableScan ノードの場合、クエリはインデックスを使用しておらず、プライマリ ストレージからドキュメントをスキャンしています。インデックスが使用されている場合、実行ツリーのリーフノードには、インデックスのインデックス ID とインデックス フィールドが表示されます。
使用されているインデックスを最適化できるかどうかを特定する
インデックスは、クエリエンジンがプライマリ ストレージから取得する必要があるドキュメントの数を減らすことができる場合、またはそのフィールドの順序でクエリの並べ替え要件を満たすことができる場合に、クエリに役立ちます。
クエリにインデックスが使用されているにもかかわらず、クエリエンジンが多くのドキュメントを取得して破棄している場合(多くのレコードを返すスキャンノードの後に、少数のレコードを返すフィルタノードが続く場合)、インデックスを使用して満たされたクエリ述部が選択的でないことを示しています。より適切なインデックスを作成するには、インデックスを作成するをご覧ください。
クエリにマルチキー以外のインデックスが使用されているにもかかわらず、クエリ実行ツリーの MajorSort ノードで特定されるように、クエリエンジンが結果セットのメモリ内並べ替えを実行している場合、使用されているインデックスではクエリの並べ替え要件を満たせないことを示しています。より適切なインデックスを作成するには、次のセクションをご覧ください。
$lookup
のインデックス
$lookup
ステージのパフォーマンスを向上させるには、from
コレクションの foreignField
にインデックスを作成します。これにより、結合オペレーションはコレクション全体をスキャンすることなく、from
コレクション内で一致するドキュメントを効率的に見つけることができます。
インデックスを作成する
インデックス管理のドキュメントに沿って、インデックスを作成します。クエリでインデックスを使用できるようにするには、次の順序でフィールドを含む通常の(マルチキーではない)インデックスを作成します。
- 等価演算子で使用されるすべてのフィールド。クエリ間で再利用される可能性を最大化するには、クエリ間の等価演算子でフィールドが出現する回数の降順でフィールドを並べ替えます。
- 並べ替えに使用されるすべてのフィールド(同じ順序)。
- 不等式演算子の範囲で使用されるフィールド(クエリ制約の選択性の降順)。
- インデックスのクエリの一部として返されるフィールド: このようなフィールドをインデックスに含めると、インデックスでクエリをカバーできるため、プライマリ ストレージからドキュメントを取得する必要がなくなります。
配列フィールドのフィルタリングと並べ替えを含むクエリの場合は、マルチキー インデックスの作成を検討してください。
クエリヒントを使用する
クエリに適したインデックスを作成したにもかかわらず、クエリエンジンがそのインデックスを使用していない場合は、クエリヒントを使用してクエリエンジンのインデックス設定をオーバーライドできます。