我的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"
}
请帮帮我吧!我错过了什么或做错了什么?
答案 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 });
这应该是第一个开始提高查询速度的地方。