2013-06-11 129 views
0

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

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

我在遍历第一个表和每个记录,转到第二个表来查找是否存在相应的记录。

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”在数据库中有一个索引。

+2

您可能正在造成(等同于)扫描。如果你只关心存在,你可能想要检查http://stackoverflow.com/questions/8389811/how-to-query-mongodb-to-test-if-an-item-exists。他们似乎认为'计数'是一个相当缓慢的操作。 – Mitch

+2

如果它只有“160,000条记录”,那么您可能需要立即撤回所有的poss_idx'标识符(只需获取这些标识符),然后在内存中进行本地比较。 – WiredPrairie

回答

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}) 

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

+0

问题出在索引上。但是删除并重新创建它并不能解决问题。 – mihsathe

+0

@mihsathe,你能否提供mongodb版本,样本文件和stats()结果为poss_pbp&poss_opt? – Jarandinor