mongo慢查询

时间:2012-12-22 12:30:07

标签: performance mongodb

我的mongodb目前已经加载了105,000个文档,我还需要插入500,000个文件,由于查询引用,插入1000个文档需要4个多小时:

插入DocA,DocA有很多引用(约30个) 查找DocA引用的数据库中的文档。 [ie: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" 
}

请帮帮我吧!我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:2)

首先,您使用的是$or,由于需要运行多个查询然后合并重复项以返回结果,因此它本身并不是世界上最快的运算符。

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

第三,您使用的是嵌套的$or,最好注意嵌套的$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 });

这应该是第一个开始提高查询速度的地方。