MongoDBクエリオプティマイザーは、さまざまなプランを試して、特定のクエリに最適なアプローチを決定することで機能します。そのクエリパターンの勝者プランは、次の約1,000クエリのために、またはexplain()
を実行するまでキャッシュされます。 。
考慮されたクエリプランを理解するには、explain(1)
を使用する必要があります 例:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
詳細には、比較されたすべての計画が表示されます。
あまり選択的ではないクエリを実行する場合(たとえば、多くのレコードが{category: { $ne:'A'}}
の基準に一致する場合 )、MongoDBは、インデックスと照合するよりも、BasicCursor(テーブルスキャン)を使用して結果を見つける方が速い場合があります。
クエリのフィールドの順序 通常、インデックスの選択に違いはありません(範囲クエリにはいくつかの例外があります)。 ソートのフィールドの順序 インデックスの選択に影響します。 sort()
の場合 基準がインデックスの順序と一致しない場合、インデックスを使用した後に結果データを再並べ替える必要があります(scanAndOrder:true
が表示されます)。 これが発生した場合は、Explain出力で)。
また、MongoDBはクエリごとに1つのインデックスのみを使用することにも注意してください($or
を除く) s)。
したがって、クエリを最適化しようとしている場合:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
3つのフィールドすべてをインデックスに含める必要があります:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
参考までに、特定のクエリでインデックスを使用するように強制する場合(通常は不要または推奨)、hint()
があります。 試すことができるオプション。