Spring の MongoTemplate を使用して MongoDB にアクセスします。
final Query query = new Query(Criteria.where("_id").exists(true));
query.with(new Sort(Direction.ASC, "FIRSTNAME", "LASTNAME", "EMAIL"));
if (count > 0) {
query.limit(count);
}
query.skip(start);
query.fields().include("FIRSTNAME");
query.fields().include("LASTNAME");
query.fields().include("EMAIL");
return mongoTemplate.find(query, User.class, "users");
MongoDB で 400.000 レコードを生成しました。上記のソート行を使用せずに最初の 25 ユーザーを要求すると、50 ミリ秒以内に結果が得られます。
sort を使用すると、4 秒以上続きます。
次に、FIRSTNAME、LASTNAME、EMAIL のインデックスを作成しました。組み合わせたものではなく、単一のインデックス
mongoTemplate.indexOps("users").ensureIndex(new Index("FIRSTNAME", Order.ASCENDING));
mongoTemplate.indexOps("users").ensureIndex(new Index("LASTNAME", Order.ASCENDING));
mongoTemplate.indexOps("users").ensureIndex(new Index("EMAIL", Order.ASCENDING));
これらのインデックスを作成した後、クエリは再び 4 秒以上続きます。
私の間違いは何ですか?
-- 編集 MongoDB はこれをコンソールに書き込みます...
Thu Jul 04 10:10:11.442 [conn50] query mydb.users query: { query: { _id: { $exists: true } }, orderby: { LASTNAME: 1, FIRSTNAME: 1, EMAIL: 1 } } ntoreturn:25 ntoskip:0 nscanned:382424 scanAndOrder:1 keyUpdates:0 numYields: 2 locks(micros) r:6903475 nreturned:25 reslen:3669 4097ms