#performance #mongodb #mongodb-.net-driver #mongodb-query
#Производительность #mongodb #mongodb-.net-driver #mongodb-запрос
Вопрос:
Мы находимся на версии Mongodb: 2.4.9
Похоже, в 2.3.2 была исправлена проблема с подсчетом
https://jira.mongodb.org/browse/SERVER-1752
Но все же моя операция подсчета выполняется очень медленно, я не могу выполнить разбивку на страницы только из-за того, что операция подсчета занимает около 10 секунд для 3,5 миллионов записей.
У кого-нибудь есть идея по этому поводу?
Редактировать
Explain() приводит к:
{
"cursor" : "BtreeCursor by_dateCreated",
"isMultiKey" : false,
"n" : 143736,
"nscannedObjects" : 2893069,
"nscanned" : 2893069,
"nscannedObjectsAllPlans" : 2904859,
"nscannedAllPlans" : 2904859,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 135,
"nChunkSkips" : 0,
"millis" : 117730,
"indexBounds" : {
"DateCreated" : [[ISODate("2014-06-24T13:36:26.952Z"), ISODate("2013-08-28T13:36:26.952Z")]]
},
}
Правка2
Запрос (я использую драйвер C #, предоставленный MongoDB)
var entities2 = (from e in this.collection.AsQueryable<SocialRecord>()
where (e.DateCreated >= fr) amp;amp; (e.DateCreated <= to)
amp;amp; bArray.Contains(e.TermMonitorIds)
amp;amp;(sources.Contains(e.SocialType))
select e).OrderByDescending(e => e.DateCreated);
return entities2.Count();
Правка3
Структура документа:
{
"_id" : ObjectId("53a456b27f781d19f40ac76c"),
"DateCreated" : ISODate("2014-06-20T15:35:56.000Z"),
"SocialType" : "facebook",
"RecordId" : "1474971936_10202431655820767",
"UserId" : "1474971936",
"UserProfileUrl" : "",
"UserProfilePictureUrl" : "/Downloads/v3/432bfeb8-901e-45a4-b739-1f3f48b69d61/facebook/2014-6/1946689/10492432_10202426005479512_740185019259071925_t.jpg",
"Description" : "",
"MediaHiResUrl" : "",
"MediaLowResUrl" : "",
"MediaMedResUrl" : "",
"SocialCount" : NumberLong(354),
"SocialCountType" : "likes",
"Sentiment" : "",
"SentimentScore" : "0.0000000",
"IsLocalContent" : true,
"IsExactMatch" : true,
"IsHashTag" : false,
"IsActive" : false,
"MediaType" : "image",
"TermMonitorIds" : [
"432bfeb8-901e-45a4-b739-1f3f48b69d61"
],
"UserName" : "",
"DisplayName" : "",
"DirectUrl" : "",
"IsUk" : true,
"IsEnglish" : true,
"Language" : "en",
"Location" : "GB",
"DataVersion" : "v3"
}
Когда я пытаюсь создать составной индекс для by_dateCreated_termMointerIds_socialType, как показано ниже
{
"DateCreated" : -1,
"SocialType" : 1,
"TermMonitorIds" : 1
}
Это еще больше замедляет выполнение запроса Count.
Datecreated — это поле, которое сильно сужает поиск. Поэтому я оставил его с одним индексом в Datecreated.
Комментарии:
1. Не могли бы вы уточнить, что вы считаете? Все документы в коллекции или есть запрос?
2. Как говорит @PeteGarafano, запрос, пример и объяснение будут иметь большое значение. Но подсчет в MongoDB может быть немного медленным, поскольку btree не ведет подсчет своих частей как таковых, он должен их подсчитывать
3. я пытаюсь выполнить разбивку на страницы, у меня есть IQueryable, который пропускает и принимает данные, но мне нужно знать количество записей, чтобы знать, сколько номеров страниц отображать в представлении.
4. @DheerajPalagiri тогда вам нужно показать нам инструкцию LINQ или вызов . Объясните в запросе. Что-то вроде этого
new MongoClient().GetServer().GetDatabase("MyDb").GetCollection("MyCol").Find(new QueryDocument()).Explain()
, если вы используете LINQ, вы можете вызвать. Объясните возвращаемый курсор.5. Насколько я знаю, подсчет записей очень сильно зависит от тактовой частоты вашего процессора.
Ответ №1:
Я использовал монго-драйвер для .net core и мой метод счетчика;
var result = collection.CountDocuments(_ => true);