2012-12-22 146 views
-1

我MongoDB是当前加载拥有近105,000文档,我还是要插入50万只以上,并正在采取比4小时更多的只是插入1000页的文件,由于查询引用:蒙戈慢查询

插入DOCA,和DocA有很多引用(大约30) 在DocA引用的数据库中查找文档。 [即:findBy-Doi-Or-Pmid-Or-Pmc(...)]

- 对于DocA引用的每个查询,大约需要400ms才能完成。

以下是配置文件的一个: 查询{$或[{$或[{DOI: “”},{PMID: “10508155”}]},{PMC: “”}]}

{ 
    "ts": ISODate("2012-12-22T11: 55: 39.796Z"), 
    "op": "query", 
    "ns": "fyparticles.mArticle", 
    "query": { 
    "$or": { 
     "0": { 
     "$or": { 
      "0": { 
      "doi": "" 
      }, 
      "1": { 
      "pmid": "10508155" 
      } 
     } 
     }, 
     "1": { 
     "pmc": "" 
     } 
    } 
    }, 
    "ntoreturn": NumberInt(1), 
    "nscanned": NumberInt(105707), 
    "responseLength": NumberInt(20), 
    "millis": NumberInt(477), 
    "client": "192.168.0.15", 
    "user": "" 
} 

和索引我已经创建:

{ 
    "v": NumberInt(1), 
    "key": { 
    "doi": NumberInt(1), 
    "pmid": NumberInt(1), 
    "pmc": NumberInt(1) 
    }, 
    "ns": "fyparticles.system.indexes", 
    "background": NumberInt(1), 
    "name": "params" 
} 

请帮我在这里!我错过了什么或做错了什么?

+0

尝试修复格式并尝试获得有关您需要的更多说明 –

回答

2

首先您使用的是$or,它本身并不是世界上运行速度最快的运营商,因为它需要运行多个查询,然后合并重复以返回结果。

其次,您正在使用带有一个索引的$or。由于$or基本上是一个或多个查询,因此您可能需要一个或多个索引来覆盖每个子句中的唯一字段。

三您正在使用嵌套$or的IT是很好的注意,嵌套$or■不要使用索引:https://jira.mongodb.org/browse/SERVER-3327

所以已经你有这样3个或更多与您的查询的性能问题。

第一关,采取的是嵌套$or

{ $or: [ {doi: ""}, {pmid: "10508155"}, {pmc: ""} ] } 

然后你可能需要在此创建三个索引(你也许可以得到一个适合所有我没有测试过):

db.col.ensureIndex({ doi: 1 }); 
db.col.ensureIndex({ pmdi: 1 }); 
db.col.ensureIndex({ pmc: 1 }); 

这应该是第一个开始让您的查询更快的地方。

+0

哇是的,感谢您的提示!显然,我使用Spring数据得到了我的查询 - findByDoiOrPmidOrPmc()给了我2 $或者,这非常糟糕,并且慢><。我已经按照你所说的那样重做了,没有更多的$或者相应的索引。 :D迅速。谢谢! – na9090

+0

@ user1665302啊,有时候最好是建立自己的查询:)我个人不相信自动化的建设者,无论如何高兴有帮助 – Sammaye