我使用了两个NOSQL数据库 MongoDB 和 Neo4j 来处理相同的信息。我想使用第一个和第二个db来比较性能。我谈到了MongoDB in this question的问题:执行时间millis总是等于0.所以我在我的集合中添加了大约250个文档,但没有任何成功:
> db.team.find({common_name:"Milan"},{_id:0, "stadium.name":1}).explain("executionStats")
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "Progettino.team",
"indexFilterSet" : false,
"parsedQuery" : {
"common_name" : {
"$eq" : "Milan"
}
},
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"_id" : 0,
"stadium.name" : 1
},
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"common_name" : {
"$eq" : "Milan"
}
},
"direction" : "forward"
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 0,
"totalKeysExamined" : 0,
"totalDocsExamined" : 253,
"executionStages" : {
"stage" : "PROJECTION",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 255,
"advanced" : 1,
"needTime" : 253,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"transformBy" : {
"_id" : 0,
"stadium.name" : 1
},
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"common_name" : {
"$eq" : "Milan"
}
},
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 255,
"advanced" : 1,
"needTime" : 253,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 255
}
}
}
例如在MongoDB中,这个查询比Neo4j更好,因为我使用非规范化模型来表示团队体育场的信息。事实上,在Neo4j中,此查询需要 50 ms ,如您所见:
那么,我该怎么做才能获得有关MongoDB中执行时间millis的信息?如果执行时间millis总是等于0,我会遇到一些问题,因为我无法在使用两个不同NoSQL DB的相同查询上显示不同的性能。
答案 0 :(得分:5)
正如你回答的另一个问题所述。你的收藏太小了。这是我从一个超过3K项目的数据库输出。注意我的executionTimeInMillis只有2毫秒。你需要更多的数据来让mongo真正流失。根据机器的大小,可以说10K以上的记录。
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "arenas.arenas",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : []
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : []
},
"direction" : "forward"
},
"rejectedPlans" : []
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 3718,
"executionTimeMillis" : 2,
"totalKeysExamined" : 0,
"totalDocsExamined" : 3718,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : []
},
"nReturned" : 3718,
"executionTimeMillisEstimate" : 0,
"works" : 3724,
"advanced" : 3718,
"needTime" : 1,
"needFetch" : 4,
"saveState" : 31,
"restoreState" : 31,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 3718
},
"allPlansExecution" : []
}
}
答案 1 :(得分:0)
我不确定比较非规范化的Mongo数据库是否公平,除非您正在讨论构建一个非常具体的用例,在此情况下您不会在您拥有的内容之上构建复杂性
也就是说,您希望自己熟悉Neo4j的密码中的PROFILE
和EXPLAIN
命令(假设您使用的是2.2.x版)。这将有助于您了解Neo4j正在做什么。
如果您还没有,我希望您要做的一件事就是在_id
标签的Team
属性上创建一个索引,就像这样:
CREATE INDEX ON :Team(_id)
如果它是一个独特的属性,你可能想要创建一个约束(它会自动为你创建一个索引),如下所示:
CREATE CONSTRAINT ON (n:Team) ASSERT n._id IS UNIQUE
如果您这样做,那么n1
中的MATCH
节点将能够使用索引直接转到您关心的磁盘上的节点,然后执行一些操作跳过PLAYS
关系以获取其他节点。
另外,同意您应该尝试使用更多数据进行测试;)