为什么mongoDB花费的时间少于获取时间?

时间:2014-12-30 11:34:21

标签: mysql mongodb mongo-java

我有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

1 个答案:

答案 0 :(得分:1)

MongoDB使用游标进行延迟评估。这意味着在很多情况下,当你启动一个返回游标的MongoDB查询时,查询还没有被执行。

当您开始从光标请求数据时,会发生实际选择。

主要原因是,这允许您在光标上调用sort(by)limit(n)skip(n)等方法,在选择任何数据之前,通常可以在数据库上更有效地处理这些方法

那么你用"获取时间"衡量的是什么?实际上也是选择的一部分。

如果要在不提取任何数据的情况下强制执行查询,可以在光标上调用explain()。数据库无法实际执行查询,无法测量执行时间。但是,在实际的实际使用中,我建议您不要这样做并按照预期的方式使用游标。