javamongo索引查询

javamongo索引查询,java,mongodb,Java,Mongodb,Mongodb中有1M数据,数据格式如下: key:"xyz", time:10 table.ensureIndex(new BasicDBObject("key", 1)); table.ensureIndex(new BasicDBObject("time", 1)); 我正在编写一个Java程序,根据“键”和“时间”范围从Mongodb查询数据,如 BasicDBObject query = new BasicDBObject("key", "xyz") .appe

Mongodb中有1M数据,数据格式如下:

key:"xyz", time:10
table.ensureIndex(new BasicDBObject("key", 1));
table.ensureIndex(new BasicDBObject("time", 1));
我正在编写一个Java程序,根据“键”和“时间”范围从Mongodb查询数据,如

BasicDBObject query = new BasicDBObject("key", "xyz")
          .append("time", new BasicDBObject("$gt", 99999).append("$lt", 100010));
在查询之前,我先为“Key”和“time”字段设置索引,如下所示:

key:"xyz", time:10
table.ensureIndex(new BasicDBObject("key", 1));
table.ensureIndex(new BasicDBObject("time", 1));

查询性能实际上运行良好(大约每秒4k)。所以我的问题是,我将“key”和“time”的索引设置为1,在这种情况下表示升序。我把它们设为-1或者其中一个设为1,另一个设为-1怎么样?根据我的情况,1和-1之间的性能差异是什么?

对于单字段索引,指定升序或降序实际上并不重要。不会对性能产生任何影响

顺序仅对复合索引(即,在2个或更多字段上创建的索引)重要。如果我们在“key”(asc)和“time”(desc)字段(即{key:1,time:-1})上创建一个复合索引,那么查询db.collection.find({key:xyz,time:10})将只在查询的第一部分使用该索引,也就是说,仅用于使用“key”筛选文档。未使用索引的第二部分


此外,MongoDB只使用索引进行查询。在您描述的情况下,由于您创建了两个单独的索引,因此只使用“key”索引。如果您创建一个复合索引{key:1,time:1}(两者都是升序),那么您的查询将执行得更好。

OK,那么您的意思是如果我像“table.ensureIndex(new BasicDBObject(“key”,1)。append(“time”,1));”这样设置,性能将更好,对吗?正确。MongoDB将使用该索引作为查询条件,即key和time.Perfect。我来测试一下。我还有一个问题。如果在此之后我再向MongoDb中插入1M数据,我是否需要再次执行“ensureIndex”?或者在开始时只插入一次,不管我们再次插入,againIt都足以在集合上创建索引一次。不需要一次又一次地做。但请记住,在创建索引后插入新文档会带来成本,因为除了插入文档外,还需要更新索引。