-1

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

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

- 所以对于 DocA 引用的每个查询,完成大约需要 400 毫秒。

以下是配置文件之一:Query { $or [ {$or [ {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" 
}

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

4

1 回答 1

2

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

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

第三,您使用$or的是nested,请注意,nested$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 });

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

于 2012-12-22T13:08:57.837 回答