Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 优化mongo查询以获得更好的响应_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 优化mongo查询以获得更好的响应

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

我试图优化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
});
目前,从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倍的数据量……你能为当前的查询提供任何解决方案吗?