【问题标题】:MongoDB query is slow and not using IndexesMongoDB 查询很慢并且不使用索引
【发布时间】:2017-11-07 02:10:37
【问题描述】:

我有一个结构如下的集合:

{
    "_id" : ObjectId("59d7cd63dc2c91e740afcdb"),
    "enrollment" : [
        { "month":-10, "enroll":'00'},
        { "month":-9, "enroll":'00'},
        { "month":-8, "enroll":'01'},
        //other months
        { "month":8, "enroll":'11'},
        { "month":9, "enroll":'11'},
        { "month":10, "enroll":'00'}
    ]
}

我正在尝试运行以下查询:

db.getCollection('collection').find({ 
          "enrollment": { 
              "$not": { 
                 "$elemMatch": { "month": { "$gte": -2, "$lte": 9 }, "enroll": "00" } 
               } 
           } 
       }).count()

此查询需要 1.6 到 1.9 秒。如果可能的话,我需要把它降到最低,到毫秒。

我尝试在月份和注册字段上创建多键索引。我尝试了各种组合,但查询没有使用任何索引。

我尝试了所有这些组合:

1. { 'enrollment.month':1 }
2. { 'enrollment.month':1 }, { 'enrollment.enroll':1 } -- two seperate indexes
3. { 'enrollment.month':1, 'enrollment.enroll':1} 
4. { 'enrollment.enroll':1, 'enrollment.month':1}

解析查询:

查询计划:

非常感谢任何提高性能的建议。

我相当有信心硬件不是问题,但欢迎提出任何建议。

我的数据量不大。它不到1GB。文档总数为 41K,子文档数约为。 1300万

注意:在过去的几天里,我已经发布了几个关于此的问题,但我正试图缩小范围。请不要将此视为我之前问题的重复。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    尝试逆向查询:

       db.getCollection('collection').find({ 
          "enrollment": { 
             "$elemMatch": { 
                 "month": { "$lt": -2, "$gt": 9 }, 
                 "enroll": {$ne: "00"} 
             } 
          } 
       }).count()
    

    【讨论】:

    • 谢谢。我可以反转 $lte 和 $gte 但不能在里面移动 $ne。原因请看这个:stackoverflow.com/questions/47085667/aggregation-is-very-slow。更改 $lte 和 $gte 没有任何区别
    • @user3731783 请阅读规则。所有信息都应包含在问题本身中。更新问题时,也请用json代码替换图片。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2017-01-18
    • 2014-08-02
    • 1970-01-01
    • 2015-05-19
    • 2014-08-15
    相关资源
    最近更新 更多