2015-02-13 3 views
0

Я пытаюсь оптимизировать MongoDB запрос для лучшего ответаОптимизация Монго запроса для лучшего ответа

db.myReports.find({ 
"CheckInDate": { 
    "$gte" : ISODate("2015-01-12T00:00:00Z"), 
    "$lte" : ISODate("2015-03-31T00:00:00Z") 
}, 
"SubscriberPropertyId": NumberLong(47984), 
"ChannelId": { 
    "$in": [701, 8275] 
}, 
"PropertyId": { 
    "$in": [47984, 3159, 5148, 61436, 66251, 70108] 
}, 
"LengthOfStay": 1 
},  { 
    "CheckInDate": 1, 
    "SubscriberPropertyId": 1, 
    "ChannelId": 1, 
    "PropertyId": 1 
}); 

В настоящее время он принимает около 3 минут, чтобы найти данные из 3 миллионов записей.

Один документ из коллекции

{ 
    "_id" : ObjectId("54dba46c320caf5a08473074"), 
    "OptimisationId" : NumberLong(1), 
    "ScheduleLogId" : NumberLong(3), 
     "ReportId" : NumberLong(4113235), 
    "SubscriberPropertyId" : NumberLong(10038), 
    "PropertyId" : NumberLong(18166), 
    "ChannelId" : 701, 
    "CheckInDate" : ISODate("2014-09-30T18:30:00Z"), 
    "LengthOfStay" : 1, 
"OccupancyIndex" : 1.0, 
"CreatedDate" : ISODate("2014-09-11T06:31:08Z"), 
    "ModifiedDate" : ISODate("2014-09-11T06:31:08Z"), 

} 

INDEX создано является:

db.myReports.getIndexes(); 
[ 
     { 
      "v" : 1, 
      "key" : { 
        "_id" : 1 
      }, 
      "name" : "_id_", 
      "ns" : "db.myReports" 
    }, 
    { 
      "v" : 1, 
      "key" : { 
        "CheckInDate" : 1, 
        "SubscriberPropertyId" : 1, 
        "ReportId" : 1, 
        "ChannelId" : 1, 
        "PropertyId" : 1 
      }, 
      "name" :  
"CheckInDate_1_SubscriberPropertyId_1_ReportId_1_Channe 

lId_1_PropertyId_1", 
      "ns" : "db.myReports" 
    }, 
    { 
      "v" : 1, 
      "key" : { 
        "CheckInDate" : 1 
      }, 
      "name" : "CheckInDate_1", 
      "ns" : "db.myReports" 
    } 
] 

Я создал индекс возможных субъектов

+0

Вы хотите доля какие документы выглядят, и что индекс вы получили до сих пор? – yaoxing

+0

Было бы здорово узнать, как настроены ваши индексы –

+1

также, что такое lakhs? –

ответ

1

запросы Put равенства, а затем варьируются запросы:

db.myReports.find({ 
    "SubscriberPropertyId": NumberLong(47984), 
    "ChannelId": { 
    "$in": [701, 8275] 
    }, 
    "PropertyId": { 
    "$in": [47984, 3159, 5148, 61436, 66251, 70108] 
    }, 
    "CheckInDate": { 
    "$gte" : ISODate("2015-01-12T00:00:00Z"), 
    "$lte" : ISODate("2015-03-31T00:00:00Z") 
    }, 
    "LengthOfStay": 1 // low selectivity, move to the end 
}, { 
    "CheckInDate": 1, 
    "SubscriberPropertyId": 1, 
    "ChannelId": 1, 
    "PropertyId": 1 
}); 

Удостоверьтесь, что индекс подходит, т.е. сделайте индекс SubscriberPropertyId, ChannelId, PropertyId, CheckInDate. LengthOfStay, вероятно, имеет слишком низкую избирательность, чтобы иметь смысл в индексе, зависит от ваших данных.

Это должно уменьшить nscanned значительно, но получить 300 тыс результатов займет свое время (на самом деле читает их, я имею в виду)

+0

Оба (мой запрос и запрос, измененные вами) дают тот же результат. Нет nscanned элементов одинаковы, время, взятое, тоже самое. Тот же запрос, если я делаю в sql server return, возвращает несколько секунд. Мы считаем mongodb намного быстрее, чем реляционные dbs для больших данных? – sangita

+0

NoSQL - это не скорость, а масштабируемость и * это не инструменты *, которые имеют значение, но парадигмы, на которых основан ваш код (помните, что facebook работает на mysql) - ваш подход довольно прочен, и есть тонна индексы, это вообще то, что у rdbms. Вам придется рассуждать об избирательности индексов и понимать шаблоны доступа или выбирать более строгие структуры данных с записью. Кроме того, 300 тыс. Строк вряд ли являются «большими данными» ... в целом, это, возможно, 400 М данных - я могу поместиться в 40 раз больше, чем в моей готовой оперативной памяти для ноутбуков ... – mnemosyn

+0

Можете ли вы предложить любое решение для текущий запрос? – sangita