Mongodb 优化mongo查询以获得更好的响应
我试图优化mongodb查询以获得更好的响应Mongodb 优化mongo查询以获得更好的响应,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我试图优化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
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
});
目前,从300万条记录中查找数据大约需要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"),
}
创建的索引是:
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"
}
]
我已经为可能的实体创建了索引首先放置相等查询,然后是范围查询:
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
,但是获得30万个结果需要时间(我的意思是,实际阅读它们)你想分享文档的外观,以及你到目前为止得到的索引吗?知道你的索引是如何设置的也很好,10万个是多少?技术上是300万。10万显然是10万,所以10万乘以30等于300万。你每天都能学到新东西使用query.explain()检查查询中使用的索引。两者(我的查询和您修改的查询)都给出相同的结果。N扫描元素的数量相同,所用时间也相同。如果在sql server中执行相同的查询,则在几秒钟内返回结果。我们认为MunGDB比大数据的关系DBS要快得多?NoSQL不是关于速度,而是可扩展性,它不是使差异产生的工具,而是基于代码的范例(记住脸谱网在MySQL上运行)——你的方法读起来很重而且有很多索引,这通常是RDBMS擅长的。您必须考虑索引的选择性,了解访问模式,或者选择一种更重于写的数据结构。此外,30万行也不是“大数据”。。。总而言之,这可能是4亿个数据量——我的现成笔记本电脑的RAM可以容纳40倍的数据量……你能为当前的查询提供任何解决方案吗?