在将大量数据推送到 mongo 的大型程序运行几分钟后,我的日志开始显示(我猜)每次更新的消息。这似乎非常嘈杂,是否有一些特殊的原因它觉得有必要这样做?
Tue Jun 5 14:32:37 [conn3] update benchmark.entity
query: { corefEntityId: "45-LOCATION" }
update: { $set: { corefEntityId: "45-LOCATION", type: "Location" },
$push: { indocs: { docid: "cfcc403b-714f-4c5d-8507-ccb5b6354654",
ordinal: 26, label: "United States", mentions: [ "United States" ] } },
$addToSet: { allMentions: { $each: [ "United States" ] } },
$inc: { documentCount: 1 } } 116ms
作为一个也许更容易回答的脚注,我想知道:是一个“upsert”,它添加到一些内部文档中比作为顶级文档简单地插入到内部文档的其他集合中更快或更慢?
我认为您的意思是 upsert 而不是 upstart(upstart 是 Ubuntu 系统上的一种工作)。Upsert 的意思是“如果存在则更新文档;如果缺少则插入(单个文档)”。MongoDB 仅通过检查您传递给它的标准文档来确定该文档丢失。
确定文档是否存在的查询可能是这里的慢部分。您应该只对 find 进行解释,以确定它是否正确使用索引并且是否尽可能高效:
http://www.mongodb.org/display/DOCS/Explain
如果它不使用索引,那么您应该添加一个以加快速度。根据此示例是否是您的查询计划的典型示例,我希望“corefEntityId”上的索引至少是一个好主意。如果在其他情况下查找更复杂,您可能需要查看复合索引并使用提示查看哪个是最佳的:
http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint
就日志记录而言 - 当它记录您在示例中看到的查询时,原因是因为默认的“slowms”值为 100。也就是说,MongoDB 将记录完成时间超过 100 毫秒的每个查询。这可以调整:
http://www.mongodb.org/display/DOCS/Database+Profiler#DatabaseProfiler-EnablingProfiling
例如,如果您想将其设置为 200 毫秒: