我有10毫米行没有任何索引的集合。在这种情况下系统应该读整个表?
当我使用eplain语句时,它显示 。db.employees.find({hundreds2:{$ LT:1}},{})解释(); " nscannedObjects" :10000000, " N" :105 米利斯" :6027
工作正常。
但我使用java来处理查询。这是代码
whereQuery = new BasicDBObject();
whereQuery.put("hundreds2",new BasicDBObject("$lt", rangeQuery));
timer.start();
setupMongoDBReadQuery(arrForRange[posOfArr]);
cursor = coll.find(whereQuery);
timer.stop();
this.selectTime= timer.elapsed();
timer.start();
while (cursor.hasNext())
{
numberOfRows++;
cursor.next();
}
timer.stop();
this.fetchTime= timer.elapsed();
this.totalOfSelAndFetch=this.selectTime+this.fetchTime;
但是在测试结果之后。我得到了这个信息
selTime=2 fetchTime=6350 numRows105 TotalTime6352
selTime=0 fetchTime=6290 numRows471 TotalTime6290
selTime=0 fetchTime=6365 numRows922 TotalTime6365
为什么获取时间不仅仅是选择。据我所知,while循环只是打印数据。为什么花这么多时间打印以及mongoDB如何选择0或2毫秒的行数?
我在MySQL中使用类似的代码和结果进行了相同的实验
selTime = 6302 fetchTime = 1 numRows105 TotalTime6303
selTime = 6318 fetchTime = 1 numRows471 TotalTime6319
selTime = 6387 fetchTime = 2 numRows922 TotalTime6389
答案 0 :(得分:1)
MongoDB使用游标进行延迟评估。这意味着在很多情况下,当你启动一个返回游标的MongoDB查询时,查询还没有被执行。
当您开始从光标请求数据时,会发生实际选择。
主要原因是,这允许您在光标上调用sort(by)
,limit(n)
或skip(n)
等方法,在选择任何数据之前,通常可以在数据库上更有效地处理这些方法
那么你用"获取时间"衡量的是什么?实际上也是选择的一部分。
如果要在不提取任何数据的情况下强制执行查询,可以在光标上调用explain()
。数据库无法实际执行查询,无法测量执行时间。但是,在实际的实际使用中,我建议您不要这样做并按照预期的方式使用游标。