2014-12-30 5 views
1

У меня есть коллекция с 10-мильными рядами без индекса. В этом случае система должна читать целую таблицу?Почему mongoDB занимает меньше времени для выбора, чем выбор времени?

Когда я использую инструкцию eplain, тогда он показывает db.employees.find ({сотни2: {$ lt: 1}}, {}). Explain(); "nscannedObjects": 10000000, "п": 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 

Зачем выбирать время больше, чем выбирать. В соответствии с моими знаниями, wh ile loop - это просто печать данных. Почему он занимает так много времени для печати и как mongoDB выбирает количество строк с 0 или 2 миллисекундами?

же эксперимент я сделал в MySQL с похож код и результаты

selTime = 6302 fetchTime = 1 numRows105 TotalTime6303
selTime = 6318 fetchTime = 1 numRows471 TotalTime6319
selTime = 6387 fetchTime = 2 numRows922 TotalTime6389

ответ

1

MongoDB использует ленивую оценку с помощью курсоров. Это означает, что во многих случаях, когда вы запускаете запрос MongoDB, который возвращает курсор, запрос еще не выполняется.

Фактический выбор происходит, когда вы начинаете запрашивать данные с помощью курсора.

Основная причина заключается в том, что это позволяет вам называть методы, подобные sort(by), limit(n) или skip(n) на курсоре, которые могут быть обработаны гораздо эффективнее в базе данных, прежде чем выбирать какие-либо данные.

Так что вы измеряете с «временем выборки», на самом деле также является частью выбора.

Если вы хотите принудительно выполнить запрос без получения данных, вы можете вызвать explain() на курсор. База данных не может измерять время выполнения без фактического выполнения запроса. Однако, в реальном использовании в реальном времени, я бы рекомендовал вам не делать этого и использовать курсоры так, как они были предназначены.

+0

Но в случае, если java отправляет запрос, равный количеству выбранных строк. это то же самое произошло, когда сделал эксперимент. с выбором 150 строк, занимает 5919 мс с системой 4996686 строк, занимает 14297 мс – user35662

Смежные вопросы