所以我有一個MongoDB實例,我試圖用另一個集合中的數據更新一個集合中的數據。這兩個藏品是participants
約180k文件和questions
約95k文件。性能調優MongoDB查詢/更新?
在participants
文檔通常是這個樣子:
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b4"),
"answers" : [
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b9"),
"question_id" : 2081,
"sub_id" : null,
"values" : [
"Yes"
]
},
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b8"),
"question_id" : 2082,
"sub_id" : 123,
"values" : [
"Would prefer to go alone"
]
},
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b7"),
"question_id" : 2082,
"sub_id" : 456,
"values" : [
"Yes"
]
}
],
"created" : ISODate("2012-03-01T17:40:21Z"),
"email" : "anonymous",
"id" : 65,
"survey" : ObjectId("52f41d579af1ff4221399a7b"),
"survey_id" : 374
}
我使用下面的查詢來執行更新:
db.participants.ensureIndex({"answers.question_id": 1, "answers.sub_id": 1});
print("created index for answer arrays!")
db.questions.find().forEach(function(doc){
db.participants.update(
{
"answers.question_id": doc.id,
"answers.sub_id": doc.sub_id
},
{
$set:
{
"answers.$.question": doc._id
}
},
false,
true
);
});
db.participants.dropIndex({"answers.question_id": 1, "answers.sub_id": 1});
但是,這需要大約20分鐘才能運行。我希望添加索引對性能有幫助,但它仍然很慢。考慮到我在索引對象數組中的字段,這個索引設置是否正確?任何人都可以看到我正在做的事情會導致緩慢?從哪裏開始尋找改善此查詢性能的建議?
查詢後調用dropIndex有什麼意義? 你的查詢的「explain()」結果如何? db.participants.find({ 「answers.question_id」:doc.id, 「answers.sub_id」:doc.sub_id })解釋() – yaoxing
我認爲這將是很多,如果你能表達得更快。它作爲一個mapreduce作業,這樣它將全部在數據庫服務器上執行而不涉及網絡。 – leif
只是爲了澄清,沒有一個單獨的應用程序正在執行此腳本。這是一個純粹的MongoDB腳本,我從shell執行。這就是說,你是否仍然認爲網絡涉及? –