为什么MongoDB记录了这么多我的查询

时间:2014-05-11 06:48:03

标签: node.js mongodb indexing mongoose

我有一个工作得很好的NodeJS MongoDB,我注意到的唯一问题是mongo正在记录我的大量查询。我尝试了不同的索引策略,但它保持不变。 mongo和node之间的通信是由mongoose完成的。

查询案例1:

Sun May 11 01:15:26.076 [conn5] query api.items query: { $query: { gameid: 209670, appid: 102 }, orderby: { price: -1 } } ntoreturn:0 ntoskip:0 nscanned:29 scanAndOrder:1 keyUpdates:0 numYields: 1 locks(micros) r:382458 nreturned:29 reslen:22686 240ms
Sun May 11 01:24:44.950 [conn5] query api.items query: { $query: { gameid: 248820, appid: 102 }, orderby: { price: -1 } } ntoreturn:0 ntoskip:0 nscanned:20 scanAndOrder:1 keyUpdates:0 locks(micros) r:78688 nreturned:20 reslen:16281 110ms

项目集合:

var itemSchema = new Schema({
    appid    : {type: Number, required: true},
    gameid   : {type: Number, required: true},
    name     : {type: String, required: true},
    hash     : {type: String, index: true},
    price    : Number,
    date     : Date
});

itemSchema.set('versionKey', false);
itemSchema.index({ appid: 1, gameid: 1 });
itemSchema.index({ gameid: 1 });

我有一套大约20.000个项目,对于所有这些项目,appid是102,并且有800个gameid。所有这些都有一个独特的ObjectId。

RockMongo告诉我可以使用以下索引:

enter image description here

当我对查询做一个解释时:

Response from server:
{
   "cursor": "BtreeCursor appid_1_gameid_1",
   "isMultiKey": false,
   "n": NumberInt(20),
   "nscannedObjects": NumberInt(20),
   "nscanned": NumberInt(20),
   "nscannedObjectsAllPlans": NumberInt(60),
   "nscannedAllPlans": NumberInt(60),
   "scanAndOrder": true,
   "indexOnly": false,
   "nYields": NumberInt(0),
   "nChunkSkips": NumberInt(0),
   "millis": NumberInt(25),
   "indexBounds": {
     "appid": [
       [
         102,
         102
      ] 
    ],
     "gameid": [
       [
         248820,
         248820 
      ] 
    ] 
  },
   "allPlans": [
     {
       "cursor": "BtreeCursor appid_1_gameid_1",
       "n": NumberInt(20),
       "nscannedObjects": NumberInt(20),
       "nscanned": NumberInt(20),
       "indexBounds": {
         "appid": [
           [
             102,
             102
          ] 
        ],
         "gameid": [
           [
             248820,
             248820 
          ] 
        ] 
      } 
    },
     {
       "cursor": "BtreeCursor gameid_1",
       "n": NumberInt(20),
       "nscannedObjects": NumberInt(20),
       "nscanned": NumberInt(20),
       "indexBounds": {
         "gameid": [
           [
             248820,
             248820 
          ] 
        ] 
      } 
    },
     {
       "cursor": "BasicCursor",
       "n": NumberInt(0),
       "nscannedObjects": NumberInt(20),
       "nscanned": NumberInt(20),
       "indexBounds": [

      ] 
    } 
  ],
   "oldPlan": {
     "cursor": "BtreeCursor appid_1_gameid_1",
     "indexBounds": {
       "appid": [
         [
           102,
           102
        ] 
      ],
       "gameid": [
         [
           248820,
           248820 
        ] 
      ] 
    } 
  },
   "server": ---
}

1 个答案:

答案 0 :(得分:2)

MongoDB记录慢于100毫秒的查询(配置文件级别1,默认slowms)。您可以使用profile命令更改阈值。

通过查看explain命令,我认为服务器的性能是个问题。你的explain命令在25ms内完成,所以它只能是服务器上的高负载引起的临时事情。检查您的彩信统计信息。

关于索引的建议很少。 您应该考虑从gameidprice列创建compound index,因为如果sort函数消耗超过32MB,MongoDB将返回错误。 如果集合中的所有文档都具有相同的appId,那么您可以从该字段中删除索引,因为它没有得到有效使用。