この場合、一致する結果セットはコレクションのほぼ全体で構成されているため、インデックスは役に立ちません。つまり、RAMにロードしてほとんどのインデックスをトラバースするだけでなく、RAMにロードしてドキュメント自体をトラバースする必要があります。
インデックスがないと、テーブルスキャンが実行され、各ドキュメントが検査され、一致した場合は返されます。
クエリがコレクションのほぼ全体を返すこのような場合、インデックスは役に立たない可能性があります。
.limit()を追加すると、クエリが高速化されます。クエリオプティマイザに.hint()でインデックスを使用しないように強制することもできます:
db.collection.find().hint({$natural:1})
選択したフィールドをインデックスを作成したフィールドのみに制限することで、クエリにインデックス自体から直接結果値を提供させることもできます。これにより、インデックススキャンを実行した後にドキュメントをロードする必要がなくなります。
これを試して、explain出力が"indexOnly":true
を示しているかどうかを確認してください
db.numbers.find({number: {$gt: 10000}}, {number:1}).explain()
詳細はこちら: