先说明一下我出问题的情况(主要原因):
new BasicDBObject("requestTime", -1)
query.put("requestTime", new BasicDBObject("$gte", startTime).append("$lte", endTime))
我这里使用了时间进行了排序和做条件查询,导致collection.count(query);和cursor.iterator();特别耗时。由于我的数据量也比较大,时间达到37秒左右。
后来通过查询MongoDB的索引,发现requestTime这个属性没有创建索引,对其进行索引创建,结果很快就将数据查询出来了。索引真的很重要。
索引相关命令:
db.tab.ensureIndex({"id":1}) //创建单列索引
db.tab.ensureIndex({"name":1},{"name":"IX_name"},{"unique":true}) //创建索引名字叫IX_name的唯一索引
db.tab.getIndexes() //查看所有索引
db.tab.dropIndexes() //删除所有索引
db.tab.find({"name":"test"}).explain("executionStats") //执行结果分析 关注输出的如下数值:explain.executionStats.executionTimeMillis 耗时毫秒
db.tab.find({"name":"test"}).hint({"name":1}).explain("executionStats") //执行结果分析 索引提示,强制使用索引
db.collection.createIndex( { "filed": sort } ) //filed :为键列
db.collection.createIndex( { "filed": sort , "filed2": sort } ) //sort :为排序。1 为升序;-1为降序。
db.system.indexes.find() //查看索引
db.tab.totalIndexSize(); //查看索引大小
db.tab.reIndex() //重建索引
db.runCommand({reIndex:"tab"})
db.tab.dropIndex(<indexname>) //删除索引
db.tab.dropIndex("id_1") //<indexname>为getIndexes看到的索引名称
db.tab.dropIndexes() //删除所有索引(注意!)