如何解决如何加快对mongodb的查询? 我将mongodriver repo用于.net核心
我只查询特定日期范围内的 500.000 数据,但大约需要15-20分钟。
我使用了 linq ,但是结果是一样的。
使用回购链接:https://github.com/mongodb/mongo-csharp-driver
我的代码:
result = await collection
.Find(filter)
.Sort(sortBy)
.Skip(skip * limit)
.Limit(limit)
.ToListAsync();
编辑1:我们专注于服务器。希望问题解决。据我所知,通过服务器的访问速度很慢,但这与服务器功能无关,而与服务器之间的层有关。
编辑2:我的测试结果;
find({ "createDate" : { "$lte" : ISODate("2020-07-31T23:59:59.59Z"),"$gte" : ISODate("2020-07-01T00:00:00Z") } }).skip(0).limit(1000000).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,"namespace" : "*","indexFilterSet" : false,"parsedQuery" : {
"$and" : [
{
"createDate" : {
"$lte" : ISODate("2020-07-31T23:59:59.590Z")
}
},{
"createDate" : {
"$gte" : ISODate("2020-07-01T00:00:00Z")
}
}
]
},"winningPlan" : {
"stage" : "LIMIT","limitAmount" : 1000000,"inputStage" : {
"stage" : "FETCH","inputStage" : {
"stage" : "IXSCAN","keyPattern" : {
"createDate" : 1
},"indexName" : "createDate","isMultiKey" : false,"multiKeyPaths" : {
"createDate" : [ ]
},"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {
"createDate" : [
"[new Date(1593561600000),new Date(1596239999590)]"
]
}
}
}
},"rejectedPlans" : [ ]
},"serverInfo" : {
"host" : "*","port" : *,"version" : "4.0.11","gitVersion" : "*"
},"ok" : 1,"operationTime" : Timestamp(1597918530,1),"$clusterTime" : {
"clusterTime" : Timestamp(1597918530,"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)
}
}
}
解决方法
加快数据库运行速度的最佳方法是从性能分析开始。您可以通过在数据库上执行以下操作来启用概要分析。
db.setProfilingLevel(2)
这将在数据库中创建一个system.profile
集合,您可以在其中查询任何其他集合。
db.system.profile.find()
有关更多信息,请参见MongoDB docs。
一旦了解了很长时间,您就可以弄清楚哪些索引值得添加以支持正在执行的查询。
我还发现在C#中的mongo客户端设置上设置“应用程序名称”属性很有用,这样您就可以查看查询来自何处。可以按以下步骤完成。
var client = new MongoClient(new MongoClientSettings
{
ApplicationName = "StackoverflowExampleApp"
});
var db = client.GetDatabase("test");
var collection = db.GetCollection<BsonDocument>("test");
var findFluent = await collection.Find(FilterDefinition<BsonDocument>.Empty)
.ToListAsync();
然后,如果我们设置了探查器并进行了查看。 我们将在个人资料文档中看到我们的appName
db.system.profile.find().pretty()
{
"op" : "query","ns" : "test.test","command" : {
"find" : "test","filter" : {
},"$db" : "test","lsid" : {
"id" : UUID("9a49130c-7086-46c4-a564-a5ee4fbfc2a1")
}
},"keysExamined" : 0,"docsExamined" : 3,"cursorExhausted" : true,"numYield" : 0,"nreturned" : 3,"locks" : {
"ReplicationStateTransition" : {
"acquireCount" : {
"w" : NumberLong(1)
}
},"Global" : {
"acquireCount" : {
"r" : NumberLong(1)
}
},"Database" : {
"acquireCount" : {
"r" : NumberLong(1)
}
},"Collection" : {
"acquireCount" : {
"r" : NumberLong(1)
}
},"Mutex" : {
"acquireCount" : {
"r" : NumberLong(1)
}
}
},"flowControl" : {
},"responseLength" : 224,"protocol" : "op_msg","millis" : 2,"planSummary" : "COLLSCAN","execStats" : {
"stage" : "COLLSCAN","nReturned" : 3,"executionTimeMillisEstimate" : 0,"works" : 5,"advanced" : 3,"needTime" : 1,"needYield" : 0,"saveState" : 0,"restoreState" : 0,"isEOF" : 1,"direction" : "forward","docsExamined" : 3
},"ts" : ISODate("2020-08-14T09:20:11.323Z"),"client" : "127.0.0.1","appName" : "StackoverflowExampleApp","allUsers" : [ ],"user" : ""
}
,您将可以在日志中搜索为
db.system.profile.find({ appName: "StackoverflowExampleApp" }).pretty()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。