非常慢的mongoDB查询

时间:2013-06-11 22:05:53

标签: performance mongodb

我是MongoDB的新手。我编写了一个JS查询,我在mongo shell中运行。

基本上,我有两张桌子。两者都有近160,000条记录。

我正在迭代第一个表并且对于每个记录,转到第二个表以查找是否存在相应的记录。

pbp = db.poss_pbp.find().batchSize(1000)


while(pbp.hasNext()){

  pbp_temp = pbp.next();
  id = (pbp_temp["poss_idx"]);

  opt_temp = db.poss_opt.find({"poss_idx": id}).count()

  if(opt_temp == 0)
  {
    //Do something
  }
}

查询运行速度极慢(每1000条记录大约需要4-5分钟)。我该怎么做才能让它更快地运作?键“poss_idx”在数据库中有一个索引。

1 个答案:

答案 0 :(得分:1)

我认为索引存在问题。我有两个相似的表:200,000条记录和大约500,000条记录。类似的请求使用索引执行约40秒,并且在没有索引的情况下执行很长时间。

运行查询:

 db.poss_opt.find({poss_idx: "some_id"}).explain()

如果上述查询无法使用索引,您将看到:

 {
     "cursor": "BasicCursor",
     "nscannedObjects": 532543,
     "nscanned": 532543,
     "millis": 712,
     "indexBounds": {},
 }

否则:

 {
     "cursor": "BtreeCursor poss_idx_1",
     "nscannedObjects": 0,
     "nscanned": 0,
     "millis": 0,
     "indexBounds": {"poss_idx": [["some_id", "some_id"]]},
 }

要查看集合的索引信息,请使用db.poss_opt.stats()db.poss_opt.getIndexes()

如果问题出在索引上,请尝试删除并创建新索引:

 db.poss_opt.dropIndex({poss_idx: 1})
 db.poss_opt.ensureIndex({poss_idx: 1})

如果您有任何疑问,请随时提出。